JavaScript Date.toJSON() produces a date which has wrong hours and minutes
Asked Answered
E

2

9

I want to print a Date to ISO-8601 standard: YYYY-MM-DDTHH:mm:ss.sssZ so I used the following lines of code, but I am getting unexpected output

var date = new Date(2012, 10, 30, 6, 51);
print('UTC Format: '+date.toGMTString());
print('toString() method: '+date.toString());
print('toJSON() method: '+date.toJSON());//print hours and minutes incorrectly
print('to UTCString() method: ' + date.toUTCString());

The corresponding output is

UTC Format: Fri, 30 Nov 2012 01:21:00 GMT
toString() method: Fri Nov 30 2012 06:51:00 GMT+0530 (India Standard Time)
toJSON() method: 2012-11-30T01:21:00.000Z
to UTCString() method: Fri, 30 Nov 2012 01:21:00 GMT

The toJSON() method prints hours and minutes incorrectly but toString() prints it correctly, I wanted to know what is the reason for that. Do I have to add time offset to the Date object, if yes then how?

Esurient answered 30/11, 2012 at 13:42 Comment(4)
the toJSON part subtracts my hours and minutes by 5:30 hours which is India's GMT timeEsurient
GMT = Greenwich Mean Time which is not India's.Predigestion
I meant its gmt + 5.30 for IndiaEsurient
We noticed such effect when saving the date in database. We use pikaday for selecting the date and use toJSON method to serialize date before sending to the server, but when we get this date back and put it in pikaday, control(Date objects) corrects the date according to your offset. So be careful when you use this method, maybe you have to use somethig else in your case.Sporophore
F
36
var date = new Date();
console.log(date.toJSON(), new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON());
Flocculate answered 29/8, 2014 at 17:6 Comment(1)
@abimelex you and others were right, i corrected my answerGallican
G
8

date.toJSON() prints the UTC-Date into a string formatted as json-date.

If you want your local-time to be printed, you have to use getTimezoneOffset(), which returns the offset in minutes. You have to convert this value into seconds and add this to the timestamp of your date:

var date = new Date(2012, 10, 30, 6, 51);
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON()

In a previous version of this answer, the offset was erroneously added instead of subtracted.

Gallican answered 30/11, 2012 at 13:50 Comment(2)
How do I do that in case of my question, say I defined var date = new Date(2012, 10, 30, 6, 51); how do I use defaultTimezoneOffset method to add the remaining 5.30 hours?Esurient
This gives me the wrong result. The answer of Sushil Dravekar gives the right result.Kinney

© 2022 - 2024 — McMap. All rights reserved.