Round a timestamp to the nearest date

前端 未结 7 1713
Happy的楠姐
Happy的楠姐 2020-12-03 11:23

I need to group a bunch of items in my web app by date created.

Each item has an exact timestamp, e.g. 1417628530199. I\'m using Moment.js and its \"tim

相关标签:
7条回答
  • 2020-12-03 11:58

    Using Moment.js, you can use the following code to round everything to the beginning of the day:

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

    You can read more about startOf() in the docs.

    0 讨论(0)
  • 2020-12-03 12:00

    Here is a clean way to get just the date in one line with no dependencies:

    let d = new Date().setHours(0, 0, 0, 0);
    
    0 讨论(0)
  • 2020-12-03 12:16

    Just construct a new Date from the existing one using only the year, month, and date. Add half a day to ensure that it is the closest date.

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

    Since this seems to have a small footprint, it can also be useful to extend the prototype to include it in the Date "class".

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

    Minimized:

    Date.prototype.round = function(){var d = new Date(+this+43200000);return new Date(d.getFullYear(), d.getMonth(), d.getDate());};
    
    0 讨论(0)
  • 2020-12-03 12:18

    Try this:

    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 讨论(0)
  • 2020-12-03 12:19

    Well, using js you can do:

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

    Edit:

    After checking several methods, this one seems to be the faster:

    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);
    }
    

    You can check difference in speed here: http://jsfiddle.net/juvian/3aqmhn2h/

    0 讨论(0)
  • 2020-12-03 12:19
    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);
    };
    

    This should work and is pretty fast.

    0 讨论(0)
提交回复
热议问题