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

将JavaScript日期初始化为午夜的最佳方式是什么?,javascript,Javascript,获取new Date()实例但将时间设置为午夜的最简单方法是什么?该方法可以使用可选的分钟、秒和毫秒参数,例如: var d = new Date(); d.setHours(0,0,0,0); 这将把你当前时区的时间设置为00:00:00.000,如果你想在UTC时间工作,你可以使用这种方法。只是想澄清一下,接受答案的片段给出了过去最接近午夜的时间 var d = new Date(); d.setHours(0,0,0,0); // last midnight 如果您希望获得未来最接近午

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

该方法可以使用可选的
分钟
毫秒
参数,例如:

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

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

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

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
}
var d=新日期();
如果(d.getHours()<12){
d、 设定时间(12,0,0,0);//下一个午夜/正午是正午
}否则{
d、 setHours(24,0,0,0);//下一个午夜/中午是午夜
}

这允许我为一个事件设置一个频率上限,只允许任何访问我的站点的访问者在早上和下午各发生一次。捕获的日期用于设置cookie的过期日期。

对象配置的一行代码:

new Date(new Date().setHours(0,0,0,0));
创建元素时:

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

我只是想在这里加上这个,因为我在这个页面上找到了如何在中做这件事,其他人也可能这样做

【理由:“时刻”一词已经出现在本页的其他地方,因此搜索引擎直接在此处搜索,并且其广泛程度足以保证在其他与日期相关的so问题中被提及的频率】

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

date.startOf('day');
对于早期版本:

date.sod();
文件:

您可能可以使用

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

如果只需要一次该值。

如果使用日期计算,夏季通常会导致比午夜多1 uur或少1小时(CEST)。当日期返回时,这会导致1天的差异。因此,日期必须精确到最近的午夜。因此,代码将是(ths到jamisOn):

var d=新日期();
如果(d.getHours()<12){
d、 设定时间(0,0,0,0);//前一个午夜
}否则{
d、 设定时间(24,0,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());

仅供参考,我在270K行上以reduce函数运行此方法(d.setHours(0,0,0,0)),比执行d.setHours(0)快20秒以上;d、 设置分钟(0);d、 设置秒(0);伟大的回答@CMS!这需要在两行中完成,以将d保留为日期对象。我最近修复了一个只在一行中完成的bug:var d=new Date().setHours(0,0,0,0)。然而,d当时是一个数字,而不是一个日期,因为setHours返回一个数字。我刚刚遇到了这个问题(我认识的聚会晚了),还需要一个返回日期的单行解决方案。对于任何正在寻找此功能的人来说,它都非常有效:
new Date(new Date().setHours(0,0,0,0))
。怪癖:如果以字符串形式输入今天的日期,它会以某种方式将日期设置为昨天。。。这是如何通过字符串输入获取今天的日期:
newdate(newdate('2021-04-29')。setHours(24,0,0,0))。getDate();//get 29
如果今天是25小时(时钟为夏时制向前调整),会发生什么?这是客户端脚本,午夜是午夜,尽管有夏时制。。也值得一提。。并不是世界上每个地方都使用DST(夏令时)@qntm:夏令时更改总是在凌晨2点到4点应用,因此这一天只有一个午夜:)。但是,是的,凌晨3点可能在一天中发生两次(facepalm)@chris不,我是说第二个片段。“今天午夜后24小时”与“明天午夜”并不总是一回事。在这些情况下,第二个代码段有效吗?@qntm:Date.setHours不会盲目地添加24小时,它更智能。相反,它返回一个时刻的时间戳,下一次时钟将显示24。考虑到节省时间。试着自己玩游戏机。有趣的是,setHours(25)返回tomorrows 1amt的时间戳要返回日期对象,请使用此
时刻(date_对象).startOf('day').toDate()如果你已经在使用moment.js了,那么你会怎么做呢。。。?在添加讽刺性评论之前,先阅读我给出的理由如何?这不会像OP要求的那样获得日期实例。这是明确的最佳答案,但需要稍加编辑才能返回日期实例。新日期(newdate().setUTCHours(0,0,0,0));谢谢我想知道如何在一行中完成它,因为我正在设置一个对象属性!回答得很好。请注意这个日期与你的时区有关!如果日期符合您的时区标准,请使用
toISOString()
检查日期。如果您想使其与零UTC偏移量兼容,最安全的方法是使用
setUTCHours
。因此,我注意到So上发布的JavaScript相关问题的一个趋势:无论使用本机JS提出的解决方案多么复杂,在外部图书馆的帮助下解决这个问题的任何答案都不可避免地会在某个时候被否决。意识到这一点,我特意用简短的前言发布了我的答案:以防您已经将example.js作为依赖项。但仍然是反对票,匿名用户?这很伤脑筋,男人:”—(我觉得这个答案不应该被否决,特别是因为提议使用moment.js的人有16票赞成(在写这篇评论的时候)。它确实以一种非常简洁而不那么明显的方式解决了这个问题。
var date = new Date($.now()); // $.now() requires jQuery
console.log('startOfDay: ' + date.startOfDay());
console.log('endOfDay: ' + date.endOfDay());