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
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.
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);
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());};
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/
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/
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.