Почему мой javascript (node.js) дает мне неправильную метку времени? - PullRequest
9 голосов
/ 20 сентября 2011

Я набрал "date" в консоли ... и я получил Tue Sep 20 01:01:49 PDT 2011 ... что правильно.

Но затем я делаю это в node.js, и получаю неправильное время.

 var ts = String(Math.round(new Date().getTime() / 1000));

Вывод: 1316505706, что на час позади.

Ответы [ 4 ]

8 голосов
/ 25 января 2012

@ KARASZI абсолютно прав насчет основной причины: метки времени Unix всегда в формате UTC, если вы не манипулируете ими.Я хотел бы предложить, чтобы, если вам нужна метка времени Unix, вы оставили ее в формате UTC и конвертировали ее в местное время, только если вам нужно отображать отформатированное время для пользователя.

Первое преимущество этого состоит в том, что всеваши серверы могут «говорить» одновременно.Например, если вы развернули серверы в Amazon EC2 US East и Amazon EC2 US West и у них общая база данных, вы можете использовать метки времени UTC в своей базе данных и на своих серверах, не беспокоясь о преобразованиях часовых поясов каждый раз.Это отличная причина использовать метки времени UTC, но это может не относиться к вам.

Вторым преимуществом этого является то, что вы можете измерять вещи по истекшему времени, не беспокоясь о переходе на летнее время (иличасовые пояса также, если вы измеряете время на движущейся платформе!).Это не так уж и много, но если бы у вас была ситуация, когда что-то занимало отрицательное время, потому что местное время «откатывалось» на час, пока вы измеряли, вы бы очень растерялись!

ТретийПричина, по которой я могу думать, очень незначительна, но некоторые любители производительности действительно оценили бы ее: вы можете получить необработанную временную метку UTC, не выделяя каждый раз новый объект Date, используя функцию «now» класса Date.

var ts = Date.now() / 1000;
4 голосов
/ 20 января 2012

Причина в том, что функция getTime возвращает время в часовом поясе UTC:

Значение, возвращаемое методом getTime, представляет собой количество миллисекунд с 1 января1970 00:00:00 UTC.Вы можете использовать этот метод, чтобы помочь назначить дату и время другому объекту Date.

Если вы хотите получить метку времени UNIX в вашем текущем часовом поясе, вы можете использовать getTimezoneOffset метод:

var date = new Date();
var ts = String(Math.round(date.getTime() / 1000) + date.getTimezoneOffset() * 60);
1 голос
/ 26 июня 2014

Обратите внимание, что вы можете избежать этой путаницы, используя пакет node.js, такой как timezonecomplete или timezone-js, который имеет гораздо менее подверженный ошибкам интерфейс для манипулирования датой и временем.

0 голосов
/ 20 сентября 2011

date в консоли вернет время сервера, тогда как использование JavaScript на веб-странице вернет местное время клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...