У меня есть дата в определенном часовом поясе в виде строки, и я хочу преобразовать ее в местное время. Но я не знаю, как установить часовой пояс в объекте Date.
Например, я Feb 28 2013 7:00 PM ET,
тогда могу
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Насколько я знаю, я могу установить время UTC или местное время. Но как мне установить время в другом часовом поясе?
Я пытался использовать сложение / вычитание смещения от UTC, но я не знаю, как противостоять переходу на летнее время. Я не уверен, что направляюсь в правильном направлении.
Как я могу пойти о преобразовании времени из другого часового пояса в местное время в JavaScript?
javascript
timezone
pavanred
источник
источник
Ответы:
Задний план
Date
Объект JavaScript отслеживает время в UTC внутри, но обычно принимает ввод и производит вывод в местное время компьютера, на котором он работает. Здесь очень мало возможностей для работы со временем в других часовых поясах.Внутреннее представление
Date
объекта - это одно число, представляющее количество миллисекунд, прошедших с тех пор1970-01-01 00:00:00 UTC
, без учета високосных секунд. В самом объекте Date нет часового пояса или формата строки. При использовании различных функцийDate
объекта локальный часовой пояс компьютера применяется к внутреннему представлению. Если функция создает строку, то информация о локали компьютера может быть принята во внимание, чтобы определить, как создать эту строку. Детали варьируются в зависимости от функции, а некоторые зависят от реализации.Единственные операции, которые
Date
объект может выполнять с нелокальными часовыми поясами:Он может анализировать строку, содержащую числовое смещение UTC из любого часового пояса. Он использует это для настройки анализируемого значения и сохраняет эквивалент UTC. Исходное местное время и смещение не сохраняются в результирующем
Date
объекте. Например:В средах, в которых реализован API интернационализации ECMASCript (он же Intl),
Date
объект может создавать строку, зависящую от локали, настроенную для данного идентификатора часового пояса. Это достигается с помощьюtimeZone
опцииtoLocaleString
и ее вариантов. Большинство реализаций будет поддерживать идентификаторы часовых поясов IANA, такие как'America/New_York'
. Например:Большинство современных сред поддерживают полный набор идентификаторов часовых поясов IANA ( см. Таблицу совместимости здесь ). Однако, имейте в виду , что только идентификатор требуемого для подкрепляться Intl является
'UTC'
, таким образом , вы должны тщательно проверить , если вам необходимо поддерживать старые браузеры или атипичные среды (например, легкие устройства ВГД).Библиотеки
Есть несколько библиотек, которые можно использовать для работы с часовыми поясами. Хотя они по-прежнему не могут заставить
Date
объект вести себя по-другому, они обычно реализуют стандартную базу данных часовых поясов IANA и предоставляют функции для ее использования в JavaScript. Современные библиотеки используют данные о часовых поясах, предоставляемые API-интерфейсом Intl, но более старые библиотеки обычно имеют накладные расходы, особенно если вы работаете в веб-браузере, поскольку база данных может стать немного больше. Некоторые из этих библиотек также позволяют выборочно сокращать набор данных либо по поддерживаемым часовым поясам, либо по диапазону дат, с которыми вы можете работать.Вот библиотеки для рассмотрения:
Intl-based библиотеки
Новая разработка должна выбрать одну из этих реализаций, которые полагаются на API-интерфейс Intl для своих данных часового пояса:
Не международные библиотеки
Эти библиотеки поддерживаются, но несут бремя упаковки собственных данных часовых поясов, которые могут быть довольно большими.
* Хотя ранее были рекомендованы Moment и Moment-Timezone, команда Moment теперь предпочитает, чтобы пользователи выбрали Luxon для новой разработки.
Прекращенные библиотеки
Эти библиотеки были официально прекращены и больше не должны использоваться.
Будущие предложения
В Предложение TC39 Временные цели , чтобы обеспечить новый набор стандартных объектов для работы с датами и временем в самом языке JavaScript. Это будет включать поддержку объекта, осведомленного о часовом поясе.
источник
var date_time = new Date()
значениеdate_time
IS (для меня в AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
и так поэтому кажется , что это уже хранится часовой пояс. Как я могу убедиться,date_time
что время указано только в формате UTC, без учета часового пояса?new Date().getTime();
Как сказал Мэтт Джонсон
Таким образом, хотя браузер не может считывать часовые пояса IANA при создании даты или имеет какие-либо методы для изменения часовых поясов в существующем объекте Date, кажется, что есть взлом:
источник
toLocaleString
для достижения обратного эффекта, и да, это должно быть общеизвестно иди, напиши статью об этом и упоминая меня :-)Date
объект, который он возвращает, - ложь. Даже в приведенном примере вывод строки включает часовой пояс локального компьютера. На моем компьютере оба результата говорят: «GMT-0700 (тихоокеанское летнее время)», где это правильно только для первого (Торонто на самом деле находится по восточному времени.) За исключением только вывода строки, временная метка, хранящаяся вDate
объекте, была сместился в другой момент времени. Это может быть полезной техникой, но имеет много предостережений - в первую очередь, чтоDate
функции объекта не будут иметь нормального вывода.Вы можете указать смещение часового пояса
new Date()
, например:или
Так как
Date
хранить время UTC (т.е.getTime
возвращает в UTC), javascript преобразует время в UTC, а когда вы вызываете такие вещи, какtoString
javascript, преобразует время UTC в местный часовой пояс браузера и возвращает строку в местном часовом поясе, т.е. если я используюUTC+8
:Также вы можете использовать обычный
getHours/Minute/Second
метод:(Это
8
означает, что после того, как время конвертировано в мое местное времяUTC+8
, число часов будет8
.)источник
Это должно решить вашу проблему, пожалуйста, не стесняйтесь предлагать исправления. Этот метод также учитывает переход на летнее время для указанной даты.
Как использовать с часовым поясом и местным временем:
источник
tzDate
прямо?Я нашел наиболее поддерживаемый способ сделать это, не беспокоясь о сторонних библиотеках, - использовать
getTimezoneOffset
для вычисления соответствующей метки времени или обновления времени, а затем использовать обычные методы для получения необходимой даты и времени.РЕДАКТИРОВАТЬ
Ранее я использовал
UTC
методы при выполнении преобразований даты, что было неправильно. При добавлении смещения ко времени использование локальныхget
функций вернет желаемые результаты.источник
timezone_offset
?timezone_offset
должно было бытьoffset
, или наоборот. Я отредактировал свой ответ, чтобы показать правильное имя переменной.Я столкнулся с аналогичной проблемой с модульными тестами (особенно в шутку, когда модульные тесты запускаются локально для создания снимков, а затем сервер CI запускается (потенциально) в другом часовом поясе, что приводит к сбою сравнения снимков). Я высмеял наш
Date
и некоторые вспомогательные методы, например, так:источник
Попробуйте использовать ctoc из npm. https://www.npmjs.com/package/ctoc_timezone
Он имеет простую функциональность для изменения часовых поясов (большинство часовых поясов около 400) и всех пользовательских форматов, которые вы хотите отображать.
источник
Основываясь на ответах выше, я использую эту собственную строку для преобразования длинной строки часового пояса в строку из трех букв:
Это даст PDT или PST в зависимости от предоставленной даты. В моем конкретном случае использования на базе Salesforce (Aura / Lightning) мы можем получить часовой пояс пользователя в длинном формате из бэкэнда.
источник
Я знаю, что он опоздал на 3 года, но, возможно, он может помочь кому-то еще, потому что я не нашел ничего подобного, за исключением библиотеки моментов и часовых поясов, которая не совсем совпадает с тем, что он просит здесь.
Я сделал нечто подобное для немецкого часового пояса, это немного сложно из-за летнего времени и високосных лет, когда у вас есть 366 дней.
может потребоваться небольшая работа с функцией isDaylightSavingTimeInGermany, в то время как разные часовые пояса меняются в разное время летнего времени.
в любом случае, проверьте эту страницу: https://github.com/zerkotin/german-timezone-converter/wiki
основные методы: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
Я приложил усилия для документирования этого, так что это не будет так запутанно.
источник
Попробуйте: date-from-timezone , он разрешает ожидаемую дату с помощью нативно доступного
Intl.DateTimeFormat
.Я использовал этот метод в одном из своих проектов уже несколько лет, но теперь я решил опубликовать его как небольшой проект ОС :)
источник
Может быть, это поможет вам
источник
Для пользователей Ionic, я был чертовски с этим, потому что
.toISOString()
должен использоваться с шаблоном HTML.Это захватит текущую дату, но, конечно, может быть добавлено к предыдущим ответам на выбранную дату.
Я получил это исправить с помощью этого:
* 60000 указывает на UTC -6, который является CST, поэтому независимо от того, какая временная зона необходима, число и разность могут быть изменены.
источник
Столкнулся с той же проблемой, использовал этот
Console.log (Date.parse («13 июня 2018 10:50:39 GMT + 1»));
Он вернет миллисекунды, на которые вы можете проверить, если +100 к Тимзоне инициализировать британское время. Надеюсь, это поможет !!
источник