12

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.

Ekom
  • 599
  • 3
  • 8
  • 24
  • Maybe try .toLocaleString() or something like new Date(Date.UTC(year, month, day, hour, minute, second)) – aggaton Jan 11 '17 at 01:14
  • @aggaton 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 defined` – Ekom Jan 11 '17 at 01:23
  • Um, the time of your post is `2017-01-11 00:56:01Z`. No idea where you lost one and a half hours? – Bergi Jan 11 '17 at 02:24
  • 2
    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? – Ekom Jan 11 '17 at 02:27
  • 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. – Bergi Jan 11 '17 at 02:28
  • @Bergi 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 }` – Ekom Jan 11 '17 at 02:39
  • 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. – Bergi Jan 11 '17 at 02:58
  • 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. – Ekom Jan 11 '17 at 03:03

2 Answers2

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.

Matt Johnson-Pint
  • 230,703
  • 74
  • 448
  • 575
1

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

new Date().toString();
KrutPandya
  • 33
  • 5