将JavaScript Date初始化到午夜的最佳方法是什么?

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

355229 次浏览

setHours方法可以接受可选的minutessecondsms参数,例如:

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

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

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

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

如果你想获得未来最近的午夜,使用下面的代码:

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

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

对象配置的一行代码:

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

创建元素时:

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

只是要在这里添加这个,因为我在这个页面上寻找如何在moment.js中这样做,其他人也可以这样做。

[理由:“时刻”这个词已经出现在本页的其他地方,所以搜索引擎直接指向这里,moment.js已经足够广泛,足以保证在其他与日期相关的so问题中被提及的频率]

因此,在2.0.0及以上版本中:

date.startOf('day');

对于早期版本:

date.sod();

文档:

< a href = " http://momentjs.com/docs/ /操作/开始/ " > http://momentjs.com/docs/ /操作/开始/ < / >

你可以用

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

如果您只需要该值一次。

如果用日期计算,夏季时间通常会比午夜(CEST)多1个小时或少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
}

如果你已经在你的项目中有d3.js作为依赖项,或者不介意把它带进来,d3-time (从v4.0.0开始,D3.js库是模块化的)已经有时间间隔

在将日期设置为“默认”值时,它们可能很有用,例如午夜、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)

我已经做了几个原型来处理这个问题。

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