首页 文章

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

提问于
浏览
8

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

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

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

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

6 回答

  • 3

    试试这个:

    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/

  • 0

    那么,使用js你可以做到:

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

    Edit:

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

    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/

  • 21

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

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

    您可以在docs中阅读有关 startOf() 的更多信息 .

  • 1

    只使用年,月和日期从现有日期构建一个新日期 .

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

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

    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());};
    
  • 0
    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);
    };
    

    这应该工作,而且非常快 .

  • 9
    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())

相关问题