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

时间:2014-12-05 20:02:53

标签: javascript date datetime momentjs

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

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

问题在于原始时间戳太具体了 - 在同一天创建的两个项目相隔一分钟,每个项目都有一个唯一的时间戳。所以我得到2 Days Ago的标题,下面是第一个项目,然后是2 Days Ago的另一个标题,下面是第二个项目,等等。

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

7 个答案:

答案 0 :(得分:21)

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

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

修改

检查了几种方法后,这个方法似乎更快:

function roundDate(timeStamp){
    timeStamp -= timeStamp % (24 * 60 * 60 * 1000);//subtract amount of time since midnight
    timeStamp += new Date().getTimezoneOffset() * 60 * 1000;//add on the timezone offset
    return new Date(timeStamp);
}

您可以在此处查看速度差异:http://jsfiddle.net/juvian/3aqmhn2h/

答案 1 :(得分:9)

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

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

您可以在docs中详细了解startOf()

答案 2 :(得分:3)

仅使用年,月和日从现有日期构造一个新日期。

var now = new Date(Date.now());
var round = new Date(now.getFullYear(),now.getMonth(),now.getDate());
console.log(now);
console.log(round);

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

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

最小化:

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

答案 3 :(得分:2)

这里是一种干净的方法,它只获取一行中的日期而没有依赖项:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

答案 4 :(得分:1)

试试这个:

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/

答案 5 :(得分:0)

instance = MyClass()
instance.buttonClick(True)
instance.buttonClick()

这应该有效并且非常快。

答案 6 :(得分: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())