【问题标题】:How to get start and end of day in Javascript?如何在 Javascript 中获取一天的开始和结束?
【发布时间】:2012-01-28 00:39:15
【问题描述】:

如何在时间戳 (GMT) 中获取今天的开始 (00:00:00) 和结束 (23:59:59)?计算机使用当地时间。

【问题讨论】:

    标签: javascript


    【解决方案1】:
    var start = new Date();
    start.setUTCHours(0,0,0,0);
    
    var end = new Date();
    end.setUTCHours(23,59,59,999);
    
    alert( start.toUTCString() + ':' + end.toUTCString() );
    

    如果您需要从中获取 UTC 时间,您可以使用UTC()

    【讨论】:

    • 我建议var end = new Date(start.getTime()); 确保您有相同的时间点 - 如果您在开始和结束初始化之间更改日期 - 它可能会发生 - 只是一个养成的好习惯跨度>
    • @MartynDavis 当一切正常时,通常在两者之间发生大约 0-2 个滴答声,但这取决于 CPU 的繁忙程度,所以如果您担心 1 个滴答声精度,那么这样做是有意义的.
    • 我还建议使用setUTCHours 而不是setHours 来获取世界时
    • 事情可能已经改变,但对我来说,这会将前一天的开始设置为 UTC 开始,并设置为前一天的 UTC 结束。
    • 请阅读@sidonaldson 极其重要的评论。使用 setHours 很危险,因为它设置的是本地时间,而不是 UTC 时间。
    【解决方案2】:

    对于dayjs库,使用startOfendOf方法如下:

    格林威治标准时间:

    const start = dayjs().startOf('day'); // set to 12:00 am today
    const end = dayjs().endOf('day'); // set to 23:59 pm today
    

    For UTC:

    const utc = require('dayjs/plugin/utc');
    dayjs.extend(utc);
    
    const start = dayjs.utc().startOf('day'); 
    const end = dayjs.utc().endOf('day'); 
    

    使用(已弃用)momentjs 库,这可以通过当前日期对象上的 startOf()endOf() 方法来实现,将字符串 'day' 作为参数传递:

    格林威治标准时间:

    var start = moment().startOf('day'); // set to 12:00 am today
    var end = moment().endOf('day'); // set to 23:59 pm today
    

    For UTC:

    var start = moment.utc().startOf('day'); 
    var end = moment.utc().endOf('day'); 
    

    【讨论】:

    • 最后我们应该使用.toDate()来获取日期。 var end = moment().endOf('day').toDate();
    • 在末尾添加 .unix() 以秒为单位获得 unix 时间戳 :) 像这样:moment().startOf('day').unix()
    • moment js 如果我有一个预定义的 Date 对象,例如moment(new Date()).endOf("day");不起作用,但 moment().endOf("day"); 确实起作用。
    • @KlasMellbourn 要获取指定时区的一天的开始时间,您可以使用 moment-timezone 并执行以下操作:moment().tz('America/Chicago').startOf('day').toDate()
    • MomentJs 现已弃用 - 可能会考虑在 date.fns 中提供一个选项
    【解决方案3】:

    使用luxon.js库,同样可以通过传递'day'作为参数使用startOf和endOf方法实现

    var DateTime = luxon.DateTime;
    DateTime.local().startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
    DateTime.local().endOf('day').toUTC().toISO(); //2017-11-17T18:29:59.999Z
    DateTime.fromISO(new Date().toISOString()).startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
    

    如果您只需要本地时间,请删除 .toUTC()

    你可能会问为什么不moment.js,答案是here

    【讨论】:

      【解决方案4】:

      MomentJs 我们可以这样声明:

         const start = moment().format('YYYY-MM-DD 00:00:01');
         const end = moment().format('YYYY-MM-DD 23:59:59');
      

      【讨论】:

      • 更有帮助!
      【解决方案5】:

      仅供参考(Tvanfosson 的合并版)

      它会在你调用函数时返回实际日期 => 日期

      export const today = {
        iso: {
          start: () => new Date(new Date().setHours(0, 0, 0, 0)).toISOString(),
          now: () => new Date().toISOString(),
          end: () => new Date(new Date().setHours(23, 59, 59, 999)).toISOString()
        },
        local: {
        start: () => new Date(new Date(new Date().setHours(0, 0, 0, 0)).toString().split('GMT')[0] + ' UTC').toISOString(),
        now: () => new Date(new Date().toString().split('GMT')[0] + ' UTC').toISOString(),
        end: () => new Date(new Date(new Date().setHours(23, 59, 59, 999)).toString().split('GMT')[0] + ' UTC').toISOString()
        }
      }
      

      //如何使用

      today.local.now(); //"2018-09-07T01:48:48.000Z" BAKU +04:00
      today.iso.now(); // "2018-09-06T21:49:00.304Z" * 
      

      * 适用于 Java8 上的 Instant time 类型,它会根据您所在的地区自动转换您的本地时间。(如果您计划编写全球应用程序)

      【讨论】:

        【解决方案6】:

        如果您只对格林威治标准时间的时间戳感兴趣,您也可以这样做,它可以方便地适应不同的时间间隔(小时:1000 * 60 * 60,12 小时:1000 * 60 * 60 * 12 等。 )

        const interval = 1000 * 60 * 60 * 24; // 24 hours in milliseconds
        
        let startOfDay = Math.floor(Date.now() / interval) * interval;
        let endOfDay = startOfDay + interval - 1; // 23:59:59:9999
        

        【讨论】:

        • 重要警告:这仅在您想要 UTC 时间时才有效。 (这就是问题所要求的......但我觉得我应该警告任何从谷歌搜索来到这里但没有意识到这一点的人。)
        【解决方案7】:

        我更喜欢使用date-fns 库来处理日期。它确实是非常棒的模块化和一致的工具。您可以通过这种方式了解一天的开始和结束:

        var startOfDay = dateFns.startOfDay;
        var endOfDay = dateFns.endOfDay;
        
        console.log('start of day ==> ', startOfDay(new Date('2015-11-11')));
        console.log('end of day ==> ', endOfDay(new Date('2015-11-11')));
        <script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>

        【讨论】:

        【解决方案8】:

        我们可以为此使用moment

        // for day start time
        moment(moment().startOf('day')).format('HH:mm')
        
        // for day end time
        moment(moment().endOf('day')).format('HH:mm')
        

        【讨论】:

          【解决方案9】:
          // get current time for UTC timezone
          const d = new Date();
          const year = d.getUTCFullYear();
          const month = d.getUTCMonth();
          const day = d.getUTCDate();
          // set time to begin day UTC
          const startTime = Date.UTC(year, month, day, 0, 0, 0, 0);
          //set time to end day UTC
          const endTime = Date.UTC(year, month, day, 23, 59, 0, 0);
          

          【讨论】:

            【解决方案10】:

            这可能有点棘手,但您可以使用Intl.DateTimeFormat

            下面的 sn-p 可以帮助您将任何时区的任何日期转换为其开始/结束时间。

            const beginingOfDay = (options = {}) => {
              const { date = new Date(), timeZone } = options;
              const parts = Intl.DateTimeFormat("en-US", {
                timeZone,
                hourCycle: "h23",
                hour: "numeric",
                minute: "numeric",
                second: "numeric",
              }).formatToParts(date);
              const hour = parseInt(parts.find((i) => i.type === "hour").value);
              const minute = parseInt(parts.find((i) => i.type === "minute").value);
              const second = parseInt(parts.find((i) => i.type === "second").value);
              return new Date(
                1000 *
                  Math.floor(
                    (date - hour * 3600000 - minute * 60000 - second * 1000) / 1000
                  )
              );
            };
            
            const endOfDay = (...args) =>
              new Date(beginingOfDay(...args).getTime() + 86399999);
            
            const beginingOfYear = () => {};
            
            console.log(beginingOfDay({ timeZone: "GMT" }));
            console.log(endOfDay({ timeZone: "GMT" }));
            console.log(beginingOfDay({ timeZone: "Asia/Tokyo" }));
            console.log(endOfDay({ timeZone: "Asia/Tokyo" }));

            【讨论】:

              【解决方案11】:

              由于您对 UTC 开始/结束时间感兴趣,您还可以使用取模运算符:

              const now = new Date().getTime();
              let startOfDay = now - (now % 86400000);
              let endDate = startOfDay + 86400000;
              

              其中 86400 是一天的秒数,结果变量是以毫秒为单位的 Epoch。

              如果您更喜欢Date 对象:

              const now = new Date().getTime();
              let startOfDay = new Date(now - (now % 86400000));
              let endDate = new Date(now - (now % 86400000) + 86400000);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-11-20
                • 1970-01-01
                • 1970-01-01
                • 2016-07-02
                • 1970-01-01
                • 1970-01-01
                • 2012-10-30
                相关资源
                最近更新 更多