Странные часовые пояса Javascript с датой () - PullRequest
0 голосов
/ 07 октября 2018

Javascript здесь безнадежен, но у меня есть проблема, которую я не могу понять, и не знаю, определено ли это поведение в JS или нет ...

Из того, что я могу понять, new Date() возвращает текущее время в текущем часовом поясе, сообщенное браузером.В настоящее время я пишу это в Милане, Италия (GMT +0200 CEST), поэтому при выполнении ниже:

var date = new Date();
console.log(date);
console.log(date.getTimezoneOffset());

я получаю, как и ожидалось:

Sun Oct 07 2018 15:42:12 GMT+0200 (Central European Summer Time)
-120

Однако, опять же из того, что я понимаю, бросая миллисекунды в конструктор дат, создается дата, основанная на времени эпохи, 1 января 1970 г. 00:00:00 GMT +0000 - так почему, если я выполняю:

var date = new Date(0); // Note The 0
console.log(date);
console.log(date.getTimezoneOffset())

Получу ли я:

Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
-60

Изменил ли браузер по какой-то причине часовой пояс, в котором он находится?Это вызывает у меня немало проблем, когда я получаю метку времени Unix из базы данных и отображаю ее в текущем часовом поясе пользователя!

Любая помощь или совет по этому вопросу будут высоко оценены!

МногиеСпасибо!:)

1 Ответ

0 голосов
/ 07 октября 2018

Числовое значение метки времени внутри каждого экземпляра Date, независимо от того, как оно построено, представляет собой смещение от фиксированного времени «эпохи» UTC.Когда вы создаете дату в вашей локали, смещение часового пояса учитывается при установке отметки времени экземпляра Date.Смещение часового пояса равно , также , которое учитывается при доступе к частям даты через API, относящиеся к локали, такие как .getTimezoneOffset().

. Таким образом, важно то, как вы получаете информацию о дате / времени out экземпляра Date.Если вы используете UTC API, вы получите информацию о времени UTC.Если вы используете API, относящиеся к локали, вы получаете значения, относящиеся к локали.

let d = new Date();
console.log("locale-relative: " + d);
console.log("UTC: " + d.toUTCString());

Теперь, как вы обрабатываете значения системной метки времени, которые вы получили в своей базе данных, зависит от того, как работает ваше приложение и что значения даты означают в этом контексте.Если важно, чтобы пользователи видели даты с точки зрения того, что ваши серверы будут делать с ними, отформатируйте даты на сервере с помощью API, относящихся к локали.Это имело бы смысл, если бы ваше приложение работало по местному времени.Например, некоторые банковские приложения (в США) работают ночью, но «ночью» в поздние вечерние часы в континентальной части США.

Если, с другой стороны, должны отображаться даты, которые вы хранитесвоим пользователям с точки зрения их локалей, затем отправьте клиенту метку времени и отформатируйте даты в виде строк на клиенте с помощью API, относящихся к локали.Это было бы целесообразно для приложения, которое позволяет пользователям настраивать сигналы тревоги и т. Д., Как правило, для пользователя имеет смысл думать с точки зрения своего местного времени.

...