将JavaScript日期初始化为午夜的最佳方法是什么?

Six*_*Bit 400 javascript

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

CMS*_*CMS 797

setHours方法可以采取可选的minutes,secondsms参数,例如:

var d = new Date();
d.setHours(0,0,0,0);
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考,我在270K行的reduce函数中运行此方法(d.setHours(0,0,0,0)),它比d.setHours(0)快20秒; d.setMinutes(0); d.setSeconds(0); 很棒的答案@CMS! (36认同)
  • 这需要在两行中完成,以将d保持为Date对象.我最近在一行中修复了一个错误:var d = new Date().setHours(0,0,0,0).但是,d是一个数字,而不是自setHours返回数字以来的日期. (28认同)
  • 我刚刚遇到过这个问题(我认识的派对很晚),还需要一个返回日期的单行解决方案.对于任何寻找此事的人,[@ Zon的回答](/sf/ask/272583391/#answer- 30100627)完美地工作:`new Date(new Date().setHours(0,0,0,0))`. (6认同)

Dan*_*Dan 198

只是想澄清一下,接受答案的片段给出了最近的午夜:

var d = new Date();
d.setHours(0,0,0,0); // last midnight
Run Code Online (Sandbox Code Playgroud)

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

var d = new Date();
d.setHours(24,0,0,0); // next midnight
Run Code Online (Sandbox Code Playgroud)

  • 这是客户端脚本,午夜是午夜,尽管夏令时..还值得一提......并非世界上每个地方都使用夏令时(夏令时) (8认同)
  • 如果今天是25小时长(时钟向前调整为夏令时)会发生什么? (6认同)
  • @qntm:Date.setHours不会盲目地添加24小时,它更聪明.相反,它返回当前时钟将显示24时刻的时间戳.考虑到节省时间.尝试自己在控制台中玩.有趣的是,setHours(25)返回明天凌晨1点的时间戳 (3认同)
  • @qntm:夏令时更改始终适用于凌晨 2 点至凌晨 4 点,因此当天只有一个午夜 :)。但是,是的,一天中凌晨 3 点可能会发生两次(面掌) (2认同)

Zon*_*Zon 57

对象配置的单行程:

new Date(new Date().setHours(0,0,0,0));
Run Code Online (Sandbox Code Playgroud)

创建元素时:

dateFieldConfig = {
      name: "mydate",
      value: new Date(new Date().setHours(0, 0, 0, 0)),
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,该日期与您的时区相关!使用“toISOString()”检查您的日期是否符合您的时区标准。如果你想让它与零 UTC 偏移兼容,最安全的方法是使用“setUTCHours”。 (5认同)
  • 谢谢!我想知道我怎么能在一行中做到这一点,因为我正在设置一个对象属性!很好的答案. (3认同)

and*_*sit 21

只是在这里添加这个,因为我登陆了这个页面,寻找如何在moment.js中执行此操作,其他人也可以这样做.

[理由:"时刻"这个词已经出现在这个页面的其他地方,所以搜索引擎就在这里,而且moment.js足够广泛,可以保证在其他日期相关的SO问题中提到的频率被提及

因此,在2.0.0及更高版本中:

date.startOf('day');
Run Code Online (Sandbox Code Playgroud)

对于早期版本:

date.sod();
Run Code Online (Sandbox Code Playgroud)

文档:

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

  • 如果你已经使用了moment.js作为众多好理由之一,那该怎么办?在添加讽刺评论之前阅读我给出的理由怎么样? (17认同)
  • 是的,让我们添加一个52kb的javascript库,做两行你可以做的事情. (2认同)

小智 9

你可以使用

new Date().setUTCHours(0,0,0,0)
Run Code Online (Sandbox Code Playgroud)

如果您只需要一次该值.

  • 正如 OP 所要求的那样,这不会获得 Date 的实例。 (3认同)
  • 这绝对是最好的答案,但需要进行一些编辑才能返回日期的实例。新日期(新日期().setUTCHours(0, 0, 0, 0)); (2认同)

jam*_*s0n 6

为@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
}
Run Code Online (Sandbox Code Playgroud)

这使我能够为活动设置频率上限,只允许该活动在上午和下午对我网站的任何访问者进行一次。捕获的日期用于设置 cookie 的过期时间。


Mik*_*ike 6

我制作了几个原型来帮我处理这个问题。

// 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;
});
Run Code Online (Sandbox Code Playgroud)

如果您不想进行安全检查,那么您可以使用

Date.prototype.startOfDay = function(){
  /*Method body here*/
};
Run Code Online (Sandbox Code Playgroud)

用法示例:

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


小智 5

如果使用夏季日期计算通常会导致比午夜 (CEST) 多 1 uur 或少 1 小时。当日期返回时,这会导致 1 天的差异。所以日期必须四舍五入到最近的午夜。所以代码将是(ths to 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
    }
Run Code Online (Sandbox Code Playgroud)