Reputation: 1091
I have a bunch of objects, each of which has a timestamp, that I want to group by date, into a JSON object. The ultimate goal is something like this:
myObject = {
"06/07/2012" : [
{
"timestamp" : "07/06/2012 13:30",
...
},
{
"timestamp" : "07/06/2012 14:00",
...
}
],
"07/07/2012 [...]
}
To get the date, I'm testing each timestamp object and using:
var visitDate = new Date(parseInt(item.timestamp, 10));
visitDate.setHours(0);
visitDate.setMinutes(0);
visitDate.setSeconds(0);
..then I'm using that to store as a name for the JSON object. It seems messy, and I'm sure there should be an easier way of doing things.
Advice / suggestions welcomed!!
Upvotes: 70
Views: 267405
Reputation: 4636
I admit I've done no performance tests, but assuming working with numbers is faster than parsing string values and creating new instances of objects, I suspect this is the most performant way to do this for UTC dates.
const MS_IN_DAY = 86400000;
function truncateDate(date: Date) {
date.setTime(Math.floor(date.getTime() / MS_IN_DAY) * MS_IN_DAY);
}
Upvotes: 0
Reputation: 82196
Since no good solution has been presented:
It actually depends on whether you want to achive 00:00:00.000 in UTC or LocalTime.
If you have a datetime-variable somedate (var somedate = new Date()
), you can just do:
somedate.setHours(0, 0, 0, 0);
and somedate will now be 00:00:00.000.
If you want a new date that is 00:00:00.000 (and not modify the original-value), you do:
var nd = new Date(somedate.getTime());
nd.setHours(0, 0, 0, 0);
The above is for localtime.
Now, if you want the GMT-representation to be 00:00:00.000, you can do it like this:
var myDate = new Date(Date.parse("2023-11-30T23:59:59.000"));
var timePortion = myDate.getTime() % 86400000;
var dateOnly = new Date(myDate - timePortion);
You could think, I'm very clever and doint it with the GMT-method for localtime, like:
var myDate = new Date(Date.parse("2023-11-30T23:59:59.000"));
var timePortion = myDate.getTime() % 86400000;
var dateOnly = new Date(myDate - timePortion + myDate.getTimezoneOffset()*60000);
And think this works. But that would actually be stupid, because if you pass 2023-11-30T00:00:00.000", and your UTC/GMT-offset is less than zero, then you're off by about 24 hours, because the GMT will be 23:XX:YY.000 of the previous day, and that's the date that will be set to 00:00:00, meaning if you transform it to localtime, you get the wrong day.
Also, if you want to transform your newly time-cleared date into an iso-string (but in localtime) be aware that somedate.toISOString() will
A) be in GMT
and
B) it will have a Z at the end
, which is not ISO 8601, because ISO 8601-format is yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff
and not yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'
.
So if you need it as ISO-8601 in localtime, you can use this function:
function removeTime(your_date)
{
var nd = new Date(your_date.getTime());
nd.setHours(0, 0, 0, 0);
function pad(number, num)
{
// Convert number to string
var str = number.toString();
// Calculate the number of zeroes to pad
var zeroCount = num - str.length;
// Pad with zeroes
for (var i = 0; i < zeroCount; i++)
{
str = '0' + str;
}
return str;
};
return nd.getFullYear() +
'-' + pad(nd.getMonth() + 1, 2) +
'-' + pad(nd.getDate(), 2) +
'T' + pad(nd.getHours(), 2) +
':' + pad(nd.getMinutes(), 2) +
':' + pad(nd.getSeconds(), 2) +
'.' + pad(nd.getMilliseconds(), 3)
};
Upvotes: 2
Reputation: 3047
If the date is in ISO string format, the date part can be seperated using
'2022-06-01T00:00:00'.split('T')[0]
result
2022-06-01
Upvotes: 2
Reputation: 11
Just split the local date string to array by "/" and arrange them to accordingly,very simple.
var date=new Date();
var datearray=date.toLocaleString().split("/");
var sqldate= datearray[2].slice(0,4)+"-"+(datearray[0]<=9?"0"+datearray[0]:datearray[0])+"-"+(datearray[1]<=9?"0"+datearray[1]:datearray[1]);
Upvotes: 1
Reputation: 29002
Date handling is unavoidably tricky. First off, you will save a lot of trouble if you send datetimes as UTC ISO strings ("yyyy-MM-dd hh:mm:ss.000Z"). If you're storing dates as strings, store them as ISO strings. Parsing dates with slashes is locale dependent and so error prone. (Europeans put the day first, americans the month.)
To get a date string from a datetime ISO string, use myDatetimeString.substring(0,10)
. To get a date object from a date string, just add the zeros...
myUtcMidnightDateObject = new Date( myDateString + ' 00:00:00Z' )
To then format your UTC midnight date object, use toLocaleString()
with the UTC option...
myFormattedDate = myUtcMidnightDateObject.toLocaleDateString({},{ timeZone: "UTC" })
Much more detail can be found here.
Upvotes: 0
Reputation: 306
let date = new Date((new Date("07/06/2012 13:30")).toDateString())
console.log(date)
Upvotes: 0
Reputation: 359
var today = new Date();
var year = today.getFullYear();
var mes = today.getMonth()+1;
var dia = today.getDate();
var fecha =dia+"-"+mes+"-"+year;
console.log(fecha);
Upvotes: 8
Reputation: 3581
If you don't mind creating an extra date object, you could try:
var tempDate = new Date(parseInt(item.timestamp, 10));
var visitDate = new Date (tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate());
I do something very similar to get a date of the current month without the time.
Upvotes: 11
Reputation: 9154
How about .toDateString()
?
Alternatively, use .getDate()
, .getMonth()
, and .getYear()
?
In my mind, if you want to group things by date, you simply want to access the date, not set it. Through having some set way of accessing the date field, you can compare them and group them together, no?
Check out all the fun Date methods here: MDN Docs
Edit: If you want to keep it as a date object, just do this:
var newDate = new Date(oldDate.toDateString());
Date's constructor is pretty smart about parsing Strings (though not without a ton of caveats, but this should work pretty consistently), so taking the old Date and printing it to just the date without any time will result in the same effect you had in the original post.
Upvotes: 108