Ответ 1
Есть ли способ, в javascript, без внешних веб-сервисов, сделать правильное преобразование? То есть, чтобы обнаружить, что 10 утра UTC-08: 00 действительно должно быть 10 утра UTC-07: 00, так как это переход на летнее время.
10: 00-8 и 10: 00-7 - два разных момента времени. Они равны 18: 00Z и 17: 00Z соответственно (Z = UTC). Когда вы измеряете с точки зрения смещения, переход на летнее время не происходит. Когда-нибудь.
Я предполагаю, что, поскольку стандартный часовой пояс в СА - это PST, люди не переключаются на размышления в PDT в летнее время. Или они?!
В общем, люди просто думают в "Тихоокеанском времени", а это значит, что и PST зимой, и PDT летом. Но компьютеры точнее. Когда вы видите PST, это означает UTC-8. Когда вы видите PDT, это означает UTC-7. Было бы неверно использовать ярлык с использованием одной формы, одновременно ссылаясь на смещение другого.
Сокращения часовых поясов может быть неоднозначным. В идеале, при обращении к зоне программно, вы должны использовать имя зоны IANA, например America/Los_Angeles
. Однако в настоящее время это невозможно во всех исполняемых файлах JavaScript без библиотеки. (Они работают над этим, хотя.)
В центральной Европе стандартная дата - UTC + 01: 00, дата перехода на летнее время - UTC + 02: 00. Таким образом, разница между CA и Европой должна составлять 9 часов, за исключением двух периодов в году, когда одна или другая область переключается между режимами Standard и Daylight Saving.
Правильно. Они могут быть разделены на 8, 9 или 10 часов. Они переключаются в совершенно разные времена, поэтому не пытайтесь управлять этим самостоятельно.
До сих пор похоже, что плагин moment.js/timezone, предложенный Guido Preite, способен на это (более или менее).
Moment-timezone - отличная библиотека. Однако, из описанного вами сценария, я не думаю, что вам нужно беспокоиться о преобразовании часового пояса так же, как вы думаете. Посмотрите, можете ли вы следовать этой логике:
- Пользователь в Калифорнии вводит дату и время в текстовое поле.
-
Вы читаете это значение текстового поля в строке и разбираете его в дату:
var dt = new Date("8/15/2013 10:00");
или используя moment.js:
var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
-
Поскольку это выполняется на пользовательском компьютере, JavaScript автоматически предполагает, что это локальная дата и время. Вам не нужно предоставлять информацию о каком-либо смещении или часовом поясе.
-
Это означает, что из-за переходов DST, что введенное время может быть недействительным или неоднозначным. JavaScript не делает такую отличную работу при обработке, что на самом деле - вы получите разные результаты в разных браузерах. Если вы хотите быть недвусмысленным, тогда вы предоставите смещение.
// PST var dt = new Date("3/11/2013 1:00 UTC-08:00"); // PDT var dt = new Date("3/11/2013 1:00 UTC-07:00");
-
Как только у вас есть
Date
(илиmoment
), вы можете оценить его эквивалент UTC:var s = dt.toISOString(); // 2013-08-15T17:00:00Z
это то же самое с moment.js, но у вас будет лучшая поддержка браузера:
var s = m.toISOString(); // 2013-08-15T17:00:00Z
-
Вы сохраняете это значение UTC в своей базе данных.
-
Другой пользователь в Центральной Европе приходит и загружает данные.
-
Вы загружаете его в
Date
илиmoment
в JavaScript:var dt = new Date("2013-08-15T17:00:00Z");
или с moment.js(опять же, лучше поддержка браузера)
var m = moment("2013-08-15T17:00:00Z")
-
Поскольку JavaScript знает правила часовых поясов локального компьютера, вы можете отобразить эту дату, и она будет представлена часовым поясом Центральной Европы:
var s = dt.ToString(); // browser specific output // ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"
или с помощью момента .js, вы можете лучше управлять форматом вывода
var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
вы также можете позволить moment.js решить, какой локализованный формат должен выводиться:
var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
Подводя итог - если вы заинтересованы только в преобразовании в локальный часовой пояс (в любой зоне, которая может быть), и вы можете сделать это всего лишь с помощью Date
. Moment.js упростит анализ и форматирование, но это не совсем необходимо.
Есть только несколько сценариев, для которых требуется библиотека часовых поясов (например, момент-время или другие).
-
Вы хотите конвертировать в зону или из зоны, которая не является местным часовым поясом или UTC.
-
Вы работаете с датами, которые были в прошлом, и с тех пор произошли изменения правил часового пояса или правил летнего времени, и у вас есть даты, которые будут интерпретироваться по-другому в соответствии с новыми правилами, чем со старыми. Это немного технически, но это происходит. Подробнее здесь и здесь.