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


439

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

Answers:


874

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

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

这样会将时间设置00:00:00.000当前时区,如果您要使用UTC时间,则可以使用该setUTCHours方法。


41
仅供参考,我正在270K行的reduce函数中运行此方法(d.setHours(0,0,0,0)),它比执行d.setHours(0)快20秒钟以上;d.setMinutes(0); d.setSeconds(0); 好答案@CMS!
jbnunn 2012年

32
这需要两行来完成,以将d保留为Date对象。我最近修复了在一行中完成该操作的错误:var d = new Date()。setHours(0,0,0,0)。但是,d是一个数字,而不是日期,因为setHours返回一个数字。
杰森

9
我只是碰到了这一点(我认识的晚一点),还需要一个返回日期的单行解决方案。对于寻找此内容的任何人,@ Zon的答案都非常适合:new Date(new Date().setHours(0,0,0,0))
SRack

226

只是想说明一下,已接受答案的摘录给出了过去最近的午夜

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

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

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

6
如果今天有25个小时(时钟根据夏时制向前调整)会怎样?
qntm 2013年

8
这是客户端脚本,午夜时分,尽管夏令..另外值得一提一提..不是世界的每一个地方使用DST(夏令时间)
克里斯-

2
@qntm:夏令时更改始终在凌晨2点至凌晨4点应用,因此在当天只有一个午夜:)。但是是的,凌晨3点可以在一天中两次(facepalm)

@chris不,我是说第二段。“今天午夜24小时后”与“明天午夜”并非总是相同的。在这些情况下,第二个片段是否起作用?
qntm

3
@qntm:Date.setHours不会盲目添加24小时,它更智能。取而代之的是,它返回当前时刻的时间戳,此时下一次时钟将显示24。考虑到节省时间。尝试自己在控制台中播放。有趣的是,setHours(25)返回明天凌晨1点的时间戳
丹,

68

对象配置的一线式:

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

创建元素时:

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

6
谢谢!我想知道如何在一行中完成此操作,因为我正在设置对象属性!好答案。
Paulo Roberto Rosa

感谢Zon,这帮助我将其写成一行。
HungrySoul

22

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

[ 理论上:“时刻”一词已经出现在此页面的其他地方,因此搜索引擎将直接指向此处,非常广泛,足以保证在其他与日期有关的SO问题中提到它的频率也得以覆盖。

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

date.startOf('day');

对于早期版本:

date.sod();

文件:

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


要获取日期对象,请使用它moment(DATE_OBJECT).startOf('day').toDate();
xinthose

2
是的,让我们添加一个52kb的JavaScript库来完成您可以在2行中完成的操作。
布鲁斯·林

19
如果由于许多原因之一而已经在使用moment.js,该怎么办?在添加讽刺评论之前,先阅读我给出的基本原理如何?
andyhasit '16

11

您可能可以使用

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

如果您只需要一次该值。


1
由于需要OP,因此无法获取Date的实例。
cobberboy

这绝对是最好的答案,但是需要一些编辑才能返回Date的实例。new Date(new Date()。setUTCHours(0,0,0,0));
VitFL

4

为@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的过期时间。


4

如果计算日期,夏季通常会比午夜(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
    }

3

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

// 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());

2

如果您已经在项目中将d3.js作为依赖项,或者不介意将其引入,则d3-timed3.js库从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用户吗?那很疼,男人:'-(
Peemster

我认为这个答案不应该被否决,特别是因为提议使用moment.js的人有16票赞成(在撰写本评论时)。它确实以非常简洁而不是显而易见的方式解决了问题。
lukeatdesignworks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.