Eduardo H.
Eduardo H.

Reputation: 45

Getting wrong date in Node.js

I tried all the solutions i found here but none work. Im just trying:

var a = new Date();
console.log(a);
//2020-01-12T05:05:17.320Z

//Time in my timezone: 2020-01-12T02:05:17.320Z

I'm from Brazil, o the timezone is -3:00

I already installed moment.js and tryed:

var moment = require('moment-timezone');
moment().tz("America/Sao_Paulo").format();

var a = new Date();
console.log(a);

but i keep getting whithout my timezone. I also tryed setting the TZ without the moment.js and didn't work.

I cant use some solution that change the way to call the "new Date()" because I have to parse a string to an object that contains Date and I use Prompts module, that get a date from console, that already return a date. I don't know what to do more.

Thanks for any help.

*I'm running on Windows, and the time is right, the configuration is pointing to the right timezone

edit1: more info

Upvotes: 1

Views: 5085

Answers (3)

Lalo19
Lalo19

Reputation: 137

Node takes UTC timestamp https://www.google.com/search?client=firefox-b-d&q=current+utc+time+online

So you can convert to a locale string and after that create a new date. This is a example for mexico city

let mx = (new Date()).toLocaleString('se-SE',{ timeZone: 'America/Mexico_City'}) + "Z";
return new Date(mx);

Upvotes: 1

Mauricio Boaventura
Mauricio Boaventura

Reputation: 26

The best way that I found was add 'getTimezoneOffset' (minutes) using moment.js

//Will returns the current "wrong" time in formart '2020-09-29T19:47:46.411Z'
//Expect: 2020-09-29T16:47:46.411Z
console.log(new Date())

So if you want see the full date in format ('DD-MM-YYYY HH:mm') of any object

var moment = require('moment')
// specificDay is a Date (type: Object) like '2020-09-22T00:00:00.000Z' 
// previously retrieved from the database without information about the time('HH:mm')
// Only with 'YYYY-MM-DD'
moment(specificDay, "YYYY-MM-DD").add(new Date().getTimezoneOffset(),'minute').format('DD-MM-YYYY HH:mm')

Upvotes: 1

V. Kuo
V. Kuo

Reputation: 78

You're very close. Moment is a Javascript library that makes formatting time very easy. You are creating your moment object, but you're not outputting it.

I made a very slight change (2nd line) and it works as expected:

var moment = require('moment-timezone');
console.log(moment().tz("America/Sao_Paulo").format());

If you want it formatted nicely, see this page: https://momentjs.com/.

For example:

console.log(moment().tz("America/Sao_Paulo").format('lll'));
// output: Jan 12, 2020 2:45 AM

How does it work?

moment() creates a time object (just like new Date(), but it's moment's special time object). .tz() is calling the timezone function and we give it your time zone as a string "America/Sao_Paulo". .format() then outputs it in a nice custom string. console.log() outputs the whole string to the screen.

Upvotes: 1

Related Questions