如何使用JavaScript日期对象四舍五入到最近的小时

如何使用JavaScript日期对象四舍五入到最近的小时,javascript,Javascript,我正在处理一个项目,该项目要求使用Date对象设置未来的时间 例如: futureTime = new Date(); futureTime.setHours(futureTime.getHours()+2); Given 8:55 => var futureTime = 9:00 Given 16:23 => var futureTime = 16:00 我的问题是,;一旦设置了未来日期,我如何舍入到最接近的整小时,然后用它设置futureTime var 例如: future

我正在处理一个项目,该项目要求使用Date对象设置未来的时间

例如:

futureTime = new Date();
futureTime.setHours(futureTime.getHours()+2);
Given 8:55 => var futureTime = 9:00
Given 16:23 => var futureTime = 16:00
我的问题是,;一旦设置了未来日期,我如何舍入到最接近的整小时,然后用它设置futureTime var

例如:

futureTime = new Date();
futureTime.setHours(futureTime.getHours()+2);
Given 8:55 => var futureTime = 9:00
Given 16:23 => var futureTime = 16:00

任何帮助都将不胜感激

将分钟四舍五入,然后清除分钟:

var date = new Date(2011,1,1,4,55); // 4:55
roundMinutes(date); // 5:00

function roundMinutes(date) {

    date.setHours(date.getHours() + Math.round(date.getMinutes()/60));
    date.setMinutes(0, 0, 0); // Resets also seconds and milliseconds

    return date;
}

另一个解决方案,它没有IAbstractDownvoteFactory的那么优雅

var d = new Date();
if(d.getMinutes() >= 30) {
   d.setHours(d.getHours() + 1);
}
d.setMinutes(0);

更简单的方法是:

var d = new Date();
d.setMinutes (d.getMinutes() + 30);
d.setMinutes (0);

或者你可以将两者混合,以获得最佳尺寸。

其他答案忽略日期的秒和毫秒分量。

已将接受的答案更新为毫秒,但它仍然无法正确处理夏令时

我会这样做:

function roundToHour(date) {
  p = 60 * 60 * 1000; // milliseconds in an hour
  return new Date(Math.round(date.getTime() / p ) * p);
}

var date = new Date(2011,1,1,4,55); // 4:55
roundToHour(date); // 5:00

date = new Date(2011,1,1,4,25); // 4:25
roundToHour(date); // 4:00

以毫秒为单位传递您想要的任何周期,以获得下一个周期示例1小时

函数计算下一周期(间隔){
const timeStampCurrentOrOldDate=Date.now();
const timeStampStartOfDay=new Date().setHours(0,0,0,0);
const timeDiff=timeStampCurrentOrOldDate-timeStampStartOfDay;
const mod=数学单元(timeDiff/interval);
返回新日期(timeStampStartOfDay+(mod*间隔));
}

console.log(calculateNext循环(1*60*60*1000));//1小时(毫秒)
我喜欢这个,它很简单,而且它也会更改日期对象,而不是简单地返回表示。这太棒了。谢谢。注意:根据您的期望,这可能是不正确的。例如,如果时间为4:55:23.100(或4:55和23秒,100毫秒),则此函数将时间设置为5:00:23.100(或5:00和23秒,100毫秒),以修复Felix Livni提到的精确舍入,您可以使用d.setMinutes(0,0,0),这也会重置秒和毫秒。@peter.bartos抱歉,我想你在引用别人的话。我相信d.setMinutes(0,0,0)在DST边界不起作用。请参阅我在已接受答案评论中的回复,以获取示例。根据您的预期,这可能是不正确的。例如,如果时间为4:55:23.100(或4:55和23秒,100毫秒),则此函数将时间设置为5:00:23.100(或5:00和23秒,100毫秒)。这不仅是因为@Felix所写,但也因为您不使用日期UTC函数,这可能会导致在时间更改为夏季和夏季期间出现错误行为(结果在不同浏览器中会有所不同)。@ivoszz非常欢迎您编辑答案。OP没有询问秒或毫秒。我也不理解您对UTC时间的担忧。如果可能的话,改进它。感谢Felix Livni提到的修复精确舍入,您可以使用date.setMinutes(0,0,0),它还可以重置秒和毫秒。根据@ivoszz注释,这不是javascript中进行日期算术的正确方法。例如,如果您的时间是2019年3月10日太阳01:30:00 GMT-0800(太平洋标准时间),那么由于时区变化,您应获得2019年3月10日太阳03:00:00 GMT-0700(太平洋昼时)。事实上,这是最新的Chrome浏览器中的行为,但在最新的Safari浏览器(v12.1.1)中并非如此。在Safari中,你看到的时间是2019年3月10日太阳02:00:00 GMT-0700(太平洋夏令时),这不是一个有效的时间。我同意,我也发现以毫秒(数字)为单位计算时间更容易,然后一切都变成了基本数学+1,因为坚持毫秒数学。但是值得注意的是,
Math.ceil
的使用将始终是四舍五入的,不会给出问题中指定的最接近的小时数。谢谢@MarkEdington!我已将代码更新为四舍五入到最接近的小时,而不是四舍五入。如果您将其扩展到天,并且输入日期将是
2018年4月12日星期四13:48:56 GMT+0300(FLE夏令时)
,则输出将是
2018年4月12日星期四03:00:00 GMT+0300(FLE夏令时)
,这是不需要的。它需要时区,而且会弄乱它。@Wish,我不理解你的评论。你说的“延长到几天”是什么意思?