new Date() in wrong time zone
Asked Answered
F

2

14

At the time of this post my current time is 2017-01-10T19:23:00.000Z but new Date() gives me 2017-01-11T00:23:19.521Z 5 hours ahead of my current timezone. This affects the way my data is stored in my MongoDB. I know I can set the time to 5 hours ago using

var datetime    = new Date();
 datetime.setHours(datetime.getHours()-5); 

But I will prefer a better way to do this. I tried using this. I still got the same time. In other parts of my code I get Tue Jan 10 2017 19:54:30 GMT-0500 (EST) different from the initial time. I will be happy if someone can point out what's wrong here.

Frequent answered 11/1, 2017 at 0:56 Comment(8)
Maybe try .toLocaleString() or something like new Date(Date.UTC(year, month, day, hour, minute, second))Wily
@Wily Thanks for your response. I used new Date().toLocaleString(); and I got 1/10/2017, 8:20:30 PM not exactly what I'm looking for. I will like the time in TZ format. However new Date(Date.UTC(year, month, day, hour, minute, second)) gave an error of year is not definedFrequent
Um, the time of your post is 2017-01-11 00:56:01Z. No idea where you lost one and a half hours?Permission
Obviously I spent the time trying to make sure the post was well explanatory while searching through suggested answers to my question. Do you have a solution or you're trying to be funny?Frequent
It seems your times are correct, you just don't realize it's in UTC (that's what the Z means). The one is formatted using .toUTCString() (or .toISOString()), the other is formatted using .toString() which does output your local timezone. They might be represented by the same Date object; and no, this does not affect how they are stored in MongoDB.Permission
@Permission so this is purely a format issue ? I initially tried to query my database using local time and it returned nothing since my collection was using UTC. My MongoDB collection is like this { "_id" : ObjectId("58758246b67c161ac8479489"), "datetime" : ISODate("2017-01-11T00:54:30.241Z"), "temperature" : 19, "humidity" : 23 }Frequent
Yes, timezones are entirely a formatting issue. In JavaScript, every Date object is just a number (milliseconds since epoch). You need to parse and format appropriately for the timezone you want.Permission
I agree. As per my MongoDB storing in UTC. How can I query that? This gave me a tough time today. I couldn't find any data for the period I was searching for.Frequent
M
7

Using moment.js is the easiest way to accomplish what you are asking.

moment().format() // "2017-01-11T13:56:15-05:00"

The output is a string in ISO-8601 format, with time zone offset in effect in your local time zone.

You could do this yourself with a lot of code that reads the various properties of the Date object, building a string from those values. But it is not built-in to the Date object in this way.

Also, note any time you try to adjust a Date object by a time zone offset, you are simply picking a different point in time. You're not actually changing the behavior of the time zone being used by the Date object.

Mediant answered 11/1, 2017 at 18:56 Comment(3)
Thanks Matt. I think I will use moment.js.Frequent
moment is the way to go.Pudendas
sadly this does not help if i need to create a date inputting day,month,year,hour, minuteMilden
R
2

If you don't want to use any exteral JS file, You can simply use following code to get current timezone.

new Date().toString();
Rodgers answered 14/11, 2019 at 9:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.