将时间戳舍入到最接近的日期

问题描述 投票:0回答:9

我需要按创建日期对网络应用程序中的一堆项目进行分组。

每个项目都有一个准确的时间戳,例如

1417628530199
。我正在使用 Moment.js 及其“从现在开始的时间”功能将这些原始时间戳转换为可读的日期,例如
2 Days Ago
。然后,我想使用可读日期作为同一日期创建的一组项目的标题。

问题在于原始时间戳过于具体 - 在同一日期创建但相隔一分钟的两个项目将各自具有唯一的时间戳。因此,我得到一个

2 Days Ago
的标题,第一个项目在下面,然后是
2 Days Ago
的另一个标题,下面有第二个项目,等等。

将原始时间戳四舍五入到最近日期的最佳方法是什么,以便在同一日期创建的任何项目都将具有完全相同的时间戳,从而可以分组在一起?

javascript date datetime momentjs
9个回答
36
投票

好吧,使用js你可以做到:

var d = new Date(1417628530199);
d.setHours(0);
d.setMinutes(0);
d.setSeconds(0);
d.setMilliseconds(0);

更简短的写法是

d.setHours(0, 0, 0, 0);


13
投票

使用 Moment.js,您可以使用以下代码将所有内容四舍五入到一天的开始:

moment().startOf('day').toString();
// -> Prints out "Fri Dec 05 2014 00:00:00 GMT-0800"

您可以在

docs
中阅读有关 startOf() 的更多信息。


11
投票

这是一种干净的方法,可以在一行中获取日期,而无需依赖:

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

5
投票

只需使用年、月和日期从现有日期构造一个新日期即可。添加半天以确保是最接近的日期。

var offset = new Date(Date.now() +43200000);
var rounded = new Date(offset .getFullYear(),offset .getMonth(),offset .getDate());
console.log(new Date());
console.log(rounded);

由于这似乎占用空间很小,因此扩展原型以将其包含在日期“类”中也很有用。

Date.prototype.round = function(){
    var dateObj = new Date(+this+43200000);
    return new Date(dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate());
};
console.log(new Date().round());

最小化:

Date.prototype.round = function(){var d = new Date(+this+43200000);return new Date(d.getFullYear(), d.getMonth(), d.getDate());};

2
投票

试试这个:

Date.prototype.formatDate = function() {
   var yyyy = this.getFullYear().toString();
   var mm = (this.getMonth()+1).toString();
   var dd  = this.getDate().toString();
   return yyyy + (mm[1]?mm:"0"+mm[0]) + (dd[1]?dd:"0"+dd[0]);
  };

var utcSeconds = 1417903843000,
    d = new Date(0);

d.setUTCSeconds(Math.round( utcSeconds / 1000.0));

var myTime = (function(){
        var theTime = moment(d.formatDate(), 'YYYYMMDD').startOf('day').fromNow();
        if(theTime.match('hours ago')){
            return 'Today';
        }
        return theTime;
    })();

alert( myTime );

http://jsfiddle.net/cdn5rvck/4/


1
投票
function roundDownDate(date) {
  if (typeof date !== "object" || !date.getUTCMilliseconds) {
      throw Error("Arg must be a Date object.");
  }
  var offsetMs = date.getTimezoneOffset() * 60 * 1000,
      oneDayMs = 24 * 60 * 60 * 1000;
  return new Date(Math.floor((date.getTime() - offsetMs) / oneDayMs) * oneDayMs + offsetMs);
};

这应该可行,而且速度相当快。


0
投票
function getDateOfTimeStamp(time) {
  var originTime = 0;
  var offsetOriginTime = originTime + new Date().getTimezoneOffset() * 60 * 1000;
  var timeSinceOrigin = time - offsetOriginTime;
  var timeModulo = timeSinceOrigin % (24 * 60 * 60 * 1000);
  var normalizedTime = time - timeModulo;

  console.log(new Date(normalizedTime) ,new Date(time));
  return normalizedTime;
}

这对我的项目有用。纯数学,不需要字符串操作,不需要外部库,所以它非常快。

您可以尝试将上述函数复制到javascript控制台,然后执行

normalizeTimeToDate(Date.now())


0
投票

我发现非常简单直观的解决方案是:

const d = new Date(Math.floor(Date.now() / 86400000) * 86400000);
// 86400000 = 24 * 60 * 60 * 1000

此外,如果您希望四舍五入为其他值,例如整数小时,您可以轻松地将上述解决方案扩展为:

const d = new Date(Math.floor(Date.now() / 3600000) * 3600000);
// 3600000 = 60 * 60 * 1000

0
投票

以下是随时获取最近日期的方法:

const time = new Date();
const date = new Date(new Date(time.setHours(time.getHours() + 12)).setHours(0, 0, 0, 0));

想法如下:

  • 时间增加12小时
  • 通过删除时间部分向下舍入到最接近的日期。通过在舍入前加上 12 小时,我们可以确保有效地舍入到最近的日期。

示例:

const time = new Date(2023, 10, 07, 11, 00, 00) // => date = new Date(2023, 10, 07)
const time = new Date(2023, 10, 07, 13, 00, 00) // => date = new Date(2023, 10, 08)
© www.soinside.com 2019 - 2024. All rights reserved.