我正在尝试在javascript中编写一个函数,该函数将使用Date
对象并根据指定的时间段将其向下舍入。
假设Date对象为1/29/18 1:14:08 PM
,并且所选的舍入周期为60 (one minute)
。该日期将变为1/29/18 1:14 PM
。同样,如果舍入周期为3600 (one hour)
,则日期将变为1/29/18 1:00 PM
。
我也希望能够指定可分割的时间段,例如3分钟(0,3,6,9 ... 57,60),这就是我在这样做的原因。一种迂回的方式。
我尝试了以下内容:
roundTimePeriod(date, granularity) {
var adjustedDate = new Date(date);
var seconds = adjustedDate.getTime() / 1000; //Get seconds since 1/1/1970
seconds = seconds - (seconds % granularity);
adjustedDate.setSeconds(seconds);
return adjustedDate;
}
问题在于,当调用setSeconds()
时,它会将这些秒添加到当前时间,而不是设置总秒数。
将setSeconds
更改为setTime
并删除getTime() / 1000
部门并不是很远,但它仍然不正确。
理想情况下,我希望这也可以按周计算,所以如果1/29是星期一,它会将时间更改为该周日的12:00 AM。
我怎样才能做到这一点?
答案 0 :(得分:1)
要向下舍入到分钟,小时,日等特定单位,只需将以下子单位归零。一周需要花费更多的努力,但是月,年等类似的算法
function roundTimePeriod(date, granularity) {
switch (granularity) {
case 'second' :
date.setMilliseconds(0);
break;
case 'minute' :
date.setSeconds(0,0);
break;
case 'hour' :
date.setMinutes(0,0,0);
break;
case 'day' :
date.setHours(0,0,0,0);
break;
case 'week' :
roundTimePeriod(date, 'day');
date.setDate(date.getDate() - date.getDay());
break;
// month, year ...
}
return date
}
['minute','hour','week'].forEach(function(grain){
console.log(grain + ' ' + roundTimePeriod(new Date(), grain).toString());
});