2014-04-16 2 views
0

Я создал приложение node.js, которое берет некоторые данные из удаленной базы данных и обрабатывает их. Некоторые из этих данных являются объектами Date. Когда я запрашиваю удаленную базу данных из своей локальной станции дома, предполагая, что данные в базе данных { dateOfEvent: "2014-04-13T00:00:00.000Z" }, ответ, который я получаю, равен { dateOfEvent: "2014-04-12T21:00:00.000Z" }, что соответствует смещению utc моей tymezone. Если я сделаю тот же запрос с облачной машины, где размещено мое приложение, ответ будет получен от { dateOfEvent: "2014-04-13T04:00:00.000Z" }, соответствующего часовому поясу GMT-4.Дата ответа Nodejs, преобразованная в локальное время

Выполняет ли узел автоматическое преобразование даты или времени или, возможно, драйвер mysql для узла?

+0

Node не преобразуют объекты даты в локальное время, прежде чем отправить их к вам, вы, вероятно, делать что-то на стороне клиента с этими датами. – adeneo

+0

MySQL определенно сохраняет даты в локальном часовом поясе. –

+0

в mysql db они сохраняются в часовом поясе utc. Я никоим образом не манипулирую их, просто получая результат запроса и смотря на него с помощью отладчика или записывая их в консоль. Они отстают на 3 часа, и я думаю, может быть, драйвер mysql делает это. –

ответ

3

Я столкнулся с той же проблемой. Похоже, что модуль mysql для node.js просто берет любую строку данных datetime, возвращаемую MySQL, и IGNORES информацию о часовом поясе, которая может присутствовать (например, часто Z входит в «Zulu time»). Полученная в результате строка времени datetime, созданная в часовом поясе, затем представляется конструктору Date() и возвращается вам как LOCAL datetime.

То есть, если ваша БД хранит даты в часовом поясе UTC, запрос MySQL узла node.js вернется, например, «2013-09-08T21: 39: 31.000Z». Теперь, если ваша локальная машина, которая сделала запрос, была в часовом поясе GMT ​​+ 7, то узлы.js и модули mysql возьмут эту строку даты в ЛОКАЛЬНОМ часовом поясе и будут вызывать Date ("2013-09-08T21: 39 : 31.000 GMT-0700 ") на этой строке, производящей« 2013-09-09T04: 39: 31 UTC »...

Вы можете исправить это в своем местном коде TZ, перемещая все данные, полученные из MySQL, так же, как и ваше местное время от UTC. (например, если вы находитесь в GMT-7), вы должны перенести все даты MySQL на 7 часов назад (предполагая, что ваша база данных MySQL находится в часовом поясе UTC).

... 
var tz_offset = (new Date()).getTimezoneOffset() * 60 * 1000; // get TZ offset in milliseconds 
var corrected_datetime = new Date(mysql_datetime.getTime() - tz_offset); // now corrected 

Надеется, что это помогает

+0

Спасибо за ответ! К сожалению, мое приложение работает на экземпляре в облаке, и я не могу контролировать, где владелец решает развернуть его. Я сделал это так же, как вы в первый раз, но после того, как владелец изменил свой центр обработки данных и, следовательно, компенсировал UTC, мне пришлось изменить подход, поскольку это не долгосрочное решение в этом контексте –

Смежные вопросы