Javascript:舍入Date()对象

时间:2018-02-09 05:03:30

标签: javascript date

我正在尝试在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。

我怎样才能做到这一点?

1 个答案:

答案 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());
});