【问题标题】:What is the best way to initialize a JavaScript Date to midnight?将 JavaScript 日期初始化为午夜的最佳方法是什么?
【发布时间】:2011-04-23 02:00:53
【问题描述】:

获取 new Date() 实例但将时间设置为午夜的最简单方法是什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    setHours 方法可以采用可选的minutessecondsms 参数,例如:

    var d = new Date();
    d.setHours(0,0,0,0);
    

    这会将时间设置为您当前时区00:00:00.000,如果您想在UTC时间工作,您可以使用setUTCHours方法。

    【讨论】:

    • 仅供参考,我在 270K 行的 reduce 函数中运行此方法 ( d.setHours(0,0,0,0) ),它比执行 d.setHours( 0); d.setMinutes(0); d.setSeconds(0);很好的答案@CMS!
    • 这需要在两行中完成以将 d 保留为 Date 对象。我最近在一行中修复了一个错误:var d = new Date().setHours(0, 0, 0, 0)。然而,d 是一个数字,而不是一个日期,因为 setHours 返回一个数字。
    • 我刚刚遇到这个(我知道的派对迟到了),还需要一个返回日期的单行解决方案。对于任何寻找这个的人,@Zon's answer 工作完美:new Date(new Date().setHours(0,0,0,0))
    • 怪癖:如果您将今天的日期作为字符串输入,它会以某种方式将日期设置为昨天...这是使用字符串输入获取今天日期的方法:new Date(new Date('2021-04-29').setHours(24,0,0,0)).getDate(); // get 29
    【解决方案2】:

    只是想澄清一下,接受答案中的 sn-p 给出了过去最近的午夜

    var d = new Date();
    d.setHours(0,0,0,0); // last midnight
    

    如果您想获得未来最近的午夜,请使用以下代码:

    var d = new Date();
    d.setHours(24,0,0,0); // next midnight
    

    【讨论】:

    • 如果今天是 25 小时(时钟向前调整以适应夏令时)会怎样?
    • 这是客户端脚本,午夜是午夜,尽管有夏令时.. 另外值得注意的是.. 并非世界上每个地方都使用 DST(夏令时)
    • @qntm:夏令时更改始终在凌晨 2 点至凌晨 4 点应用,因此当天只有一个午夜 :)。但是,是的,凌晨 3 点可能会在一天中发生两次(facepalm)
    • @chris 不,我的意思是第二个 sn-p。 “今天午夜后 24 小时”与“明天午夜”并不总是一回事。在这些情况下,第二个 sn-p 是否有效?
    • @qntm: Date.setHours 不盲目加24小时,更智能。相反,它会返回该时刻的时间戳,即下次时钟将显示 24 时。考虑到节省时间。尝试自己在控制台中玩。有趣的是,setHours(25) 返回明天凌晨 1 点的时间戳
    【解决方案3】:

    对象配置的单行:

    new Date(new Date().setHours(0,0,0,0));
    

    创建元素时:

    dateFieldConfig = {
          name: "mydate",
          value: new Date(new Date().setHours(0, 0, 0, 0)),
    }
    

    【讨论】:

    • 谢谢!我想知道如何在一行中完成它,因为我正在设置一个对象属性!很好的答案。
    • 请注意,此日期与您的时区有关!如果您的日期符合您的时区标准,请使用 toISOString() 检查您的日期。最安全的方法是使用setUTCHours,如果你想让它与零 UTC 偏移兼容。
    【解决方案4】:

    只是要在此处添加此内容,因为我登陆此页面以在 moment.js 中寻找如何执行此操作,其他人也可能这样做。

    [基本原理:“时刻”这个词已经出现在此页面的其他地方,因此搜索引擎直接在这里,并且moment.js 的广泛性足以保证在其他与日期相关的 SO 问题中提及它的频率如何]

    所以,在 2.0.0 及以上版本中:

    date.startOf('day');
    

    对于早期版本:

    date.sod();
    

    文档:

    http://momentjs.com/docs/#/manipulating/start-of/

    【讨论】:

    • 要取回一个日期对象,使用这个moment(DATE_OBJECT).startOf('day').toDate();
    • 如果您已经在使用moment.js 是出于您可能的众多好理由之一...?在添加讽刺评论之前阅读我给出的理由怎么样?
    【解决方案5】:

    你可能会使用

    new Date().setUTCHours(0,0,0,0)
    

    如果您只需要该值一次。

    【讨论】:

    • 这并没有按照 OP 的要求获取 Date 的实例。
    • 这绝对是最佳答案,但需要稍作修改才能返回 Date 的实例。新日期(新日期().setUTCHours(0, 0, 0, 0));
    【解决方案6】:

    如果用日期计算夏令时通常会导致比午夜 (CEST) 多 1 小时或少 1 小时。当日期返回时,这会导致 1 天的差异。所以日期必须四舍五入到最近的午夜。所以代码将是(给 jamisOn):

        var d = new Date();
        if(d.getHours() < 12) {
        d.setHours(0,0,0,0); // previous midnight day
        } else {
        d.setHours(24,0,0,0); // next midnight day
        }
    

    【讨论】:

      【解决方案7】:

      为@Dan 的示例添加有用性,我需要找到下一个中​​午或午夜。

      var d = new Date();
      if(d.getHours() < 12) {
         d.setHours(12,0,0,0); // next midnight/midday is midday
      } else {
         d.setHours(24,0,0,0); // next midnight/midday is midnight
      }
      

      这让我可以为事件设置频次上限,只允许它在早上和下午发生一次,以供任何访问我网站的访问者使用。捕获的日期用于设置 cookie 的过期时间。

      【讨论】:

        【解决方案8】:

        我已经制作了几个原型来为我处理这个问题。

        // This is a safety check to make sure the prototype is not already defined.
        Function.prototype.method = function (name, func) {
            if (!this.prototype[name]) {
                this.prototype[name] = func;
                return this;
            }
        };
        
        Date.method('endOfDay', function () {
            var date = new Date(this);
            date.setHours(23, 59, 59, 999);
            return date;
        });
        
        Date.method('startOfDay', function () {
            var date = new Date(this);
            date.setHours(0, 0, 0, 0);
            return date;
        });
        

        如果你不想要安全检查,那么你可以使用

        Date.prototype.startOfDay = function(){
          /*Method body here*/
        };
        

        示例用法:

        var date = new Date($.now()); // $.now() requires jQuery
        console.log('startOfDay: ' + date.startOfDay());
        console.log('endOfDay: ' + date.endOfDay());
        

        【讨论】:

          【解决方案9】:

          如果您的项目中已经有 d3.js 作为依赖项,或者不介意引入它,d3-time (d3.js library is modular as of v4.0.0) 已经获得了Intervals

          当将日期设置为“默认”值时,它们可能很有用,例如午夜、0.00 秒、月初等。

          var d = new Date(); // Wed Aug 02 2017 15:01:07 GMT+0200 (CEST)
          d3.timeHour(d) // Wed Aug 02 2017 00:00:00 GMT+0200 (CEST)
          d3.timeMonth(d) // Tue Aug 01 2017 00:00:00 GMT+0200 (CEST)
          

          【讨论】:

          • 所以我注意到 SO 上发布的 JavaScript 相关问题的趋势:无论使用本机 JS 提出的解决方案多么复杂,任何借助外部库解决问题的答案都将不可避免地在某个时间点被否决。意识到这一点,我小心翼翼地用简短的前言发布我的答案:如果您已经将 example.js 作为依赖项。然而仍然是反对票的匿名 SO 用户?好痛,伙计:'-(
          • 我认为这个答案不应该被否决,特别是因为提议使用 moment.js 的人有 16 个赞成票(在撰写此评论时)。它确实以非常简洁而不那么明显的方式解决了问题。
          猜你喜欢
          • 1970-01-01
          • 2013-08-25
          • 2010-09-17
          • 1970-01-01
          • 2012-01-28
          • 2012-02-08
          • 1970-01-01
          • 2019-07-24
          相关资源
          最近更新 更多