Проблема с часовым поясом при использовании REST Api и JS

Я использую библиотеку FormatJS вместе с Handlebars для отображения списка событий, которые произошли в прошлом. Я вызываю конечную точку в REST API моего сервера, которая возвращает мне список событий в Json с датой и временем для отображения для каждого события. Банкомат. Я сохраняю дату и время в БД, используя часовой пояс GMT.

Итак, когда я получаю свой Json, я обрабатываю дату и время следующим образом:

{{formatRelative commentDate}}

Моя проблема в том, что, поскольку даты и время хранятся в GMT, они также отображаются так. Например, поскольку я нахожусь в часовом поясе GMT+2, как только новое событие создается и появляется в списке, я вижу, что оно «произошло 2 часа назад», хотя должно быть «несколько секунд назад».

Итак, есть ли способ справиться с этим? Совершаю ли я ошибку, сохраняя дату и время в GMT в своей БД, и если да, то как бы вы обрабатывали дату и время, поступающие из разных часовых поясов, и отображали их людям в других часовых поясах?

Конечно, я мог бы настроить помощника formatRelative для игры с getTimezoneOffset и получить желаемый результат, но я хотел знать, есть ли что-то лучшее, что можно сделать.

Большое спасибо впереди!


person Jeremy Belolo    schedule 28.02.2016    source источник
comment
Обычно предпочтительнее хранить даты в формате UTC, поскольку это упрощает преобразование в любой другой часовой пояс. Кроме того, объекты даты ECMAScript основаны на UTC. Кажется, ваша проблема связана с преобразованием даты JSON в локальную, но вы не показываете, как вы это делаете.   -  person RobG    schedule 28.02.2016
comment
@RobG, потому что я ничего не конвертирую! Получение Json, содержащего дату и время в формате 2016-02-28 10:15:53 - это время UTC, используя его непосредственно в помощнике formatRelative, как показано, больше ничего не делая.   -  person Jeremy Belolo    schedule 28.02.2016
comment
Универсальное время в более центральных частях архитектуры — хороший способ: currentmillis.com/standard/specification /c Я не думаю, что вы делаете концептуальные ошибки, похоже, что ваше смещение где-то потеряно. formatjs.io/handlebars/#formatRelative приводит меня к мысли, что то, что на самом деле отформатировано, определяется временем как количество миллисекунд с начала эпохи, но я вижу, что вы возвращаете удобочитаемое время. Существует ли соглашение о том, что время, возвращаемое сервером, интерпретируется как UTC? (потому что вы не указываете часовой пояс, разве в конце не должно быть UTC или GMT?)   -  person Sandman    schedule 28.02.2016
comment
@JeremyBelolo—2016-02-28 10:15:53 ​​недействителен ISO 8601, поэтому синтаксический анализ зависит от реализации (и может вообще не анализироваться некоторыми хостами). Подумайте о том, чтобы разобрать его самостоятельно (библиотека может помочь, но функция состоит из 2 строк).   -  person RobG    schedule 29.02.2016


Ответы (1)


Ключом к пониманию вашего вопроса является то, что вы написали в комментариях:

Получение Json, содержащего дату и время в формате 2016-02-28 10:15:53 - это время UTC

Вы должны убедиться, что значение в JSON находится в полном формате ISO8601, включая соответствующее смещение или символ Z для обозначения UTC: 2016-02-28T10:15:53Z

Без смещения большинство реализаций будут считать, что значение представлено в местном времени, что объясняет ваши результаты.

Таким образом, проблема заключается в вашем коде на стороне сервера, а не в коде JavaScript. Может быть обходной путь на стороне клиента, который вы могли бы применить, когда строка даты анализируется из JSON, но на самом деле лучшим решением было бы квалифицировать ее на сервере.

person Matt Johnson-Pint    schedule 28.02.2016
comment
Большое спасибо ! Я попробую и подтвержу ответ, когда увижу, что он работает. - person Jeremy Belolo; 28.02.2016
comment
Это работает отлично, спасибо :) Мне просто интересно, почему MySQL не хранит дату и время непосредственно в этом формате, а не в том, который я написал? - person Jeremy Belolo; 02.03.2016
comment
Базы данных (во всяком случае, большинство из них) вообще не хранят дату и время в виде строк. Они хранятся в пользовательском двоичном формате, который обычно основан на количестве x единиц с даты y. Они могут быть отформатированы как строки, когда вы просматриваете их в утилите или используете их в своем собственном программном обеспечении. Многие базы данных даже не отправляют строки по сети в своих родных протоколах. Только когда вы используете их, применяется формат. То же верно и для чисел. Рассмотрим 1,234.567. БД не хранит запятую или десятичную точку. - person Matt Johnson-Pint; 02.03.2016