58

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!!

Paul
  • 961
  • 1
  • 6
  • 20
  • I can't imagine `new Date(parseInt("07/06/2012 13:30",10));` would work. Or am I missing something? – KooiInc Aug 07 '12 at 14:24
  • Yeah, you're right - sorry, this is pasted out of some of my existing code and not proof-read! The current code stores the timestamp as the 'milliseconds from epoch' format, so it made more sense in its original context... – Paul Aug 07 '12 at 14:29
  • 1
    You should always store your dates with `.toISOString()` you're going to have issues with timezones storing dates with the strings you have. The only time you want to use that format is when you display it. – justin.m.chase Apr 24 '20 at 18:25
  • You're correct @justin.m.chase - these days you should. When this question was written we still had to support IE8 which didn't support `toISOString()`. Hallelujah we live in a modern world now! – Paul Apr 27 '20 at 15:37

8 Answers8

97

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.

Nick
  • 8,964
  • 4
  • 26
  • 37
  • That's probably a more sensible way to do it, I was thinking of leaving it as a Date object, although it's stored as text in JSON anyway I guess! The original reason for not using `.toDateString()` was being unsure about having spaces in the field. Don't suppose that matters though really – Paul Aug 07 '12 at 14:16
  • 1
    Note: scroll down a bit to find the *full* list of methods. So many variants of toString, your head will pop. – Nick Aug 07 '12 at 14:16
  • ooh `.valueOf()` - that's also useful! Thanks! – Paul Aug 07 '12 at 14:19
  • Happy to help. If you like, I edited the question to give a way to keep them as Date objects, if it suits your fancy – Nick Aug 07 '12 at 14:19
20
new Date().toISOString().split('T')[0]
Omar AlSaheb
  • 201
  • 2
  • 2
11

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.

James Tomasino
  • 3,520
  • 1
  • 20
  • 38
8

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);
Charlie
  • 349
  • 4
  • 8
1

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]);
1

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
Sukesh Chand
  • 2,339
  • 2
  • 21
  • 29
0

let date = new Date((new Date("07/06/2012 13:30")).toDateString())
console.log(date)
Raimundo
  • 53
  • 1
  • 3
T4professor
  • 286
  • 2
  • 4
0

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.

bbsimonbb
  • 27,056
  • 15
  • 80
  • 110