Как уже упоминалось, toLocaleString
возвращает string
, и, следовательно, вы не можете рассматривать его как Date
объект.Так как вы все равно хотите отобразить ее как строку, тогда правильный подход - просто передать все аргументов, которые вам нужны, чтобы получить строку в нужном формате.
Дляпример:
var s = new Date().toLocaleString(undefined, {
timeZone: 'America/New_York',
weekday: 'long',
year: 'numeric',
month: 'numeric',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
})
Это дает текущее время в America/New_York
(восточное время США), используя языковой стандарт пользователя для форматирования (undefined
по умолчанию - языковой стандарт пользователя), и указывает, что полное имядолжен быть указан день недели, а также числовой формат даты и времени.
Пример выходных данных в зависимости от локали пользователя:
en-US "Thursday, 4/11/2019, 1:13:14 PM"
en-GB "Thursday, 11/04/2019, 13:13:14"
fr-FR "jeudi 11/04/2019 à 13:13:14"
zh-CN "2019年4月11日星期四 下午1:13:14"
Все параметры можно прочитать в документация toLocaleString
.
В другом ответе также предлагалось, чтобы вы могли взять вывод toLocaleString
и проанализировать его с помощью конструктора объекта Date
.Такой подход не рекомендуется по следующим причинам:
Спецификация ECMAScript не требует, чтобы эти строки могли обрабатываться синтаксическим анализатором Date
.Требуется только разбор строк, соответствующих ISO8601, таких как "2019-04-11T13:13:14"
.Все остальное (даже если это выглядит просто как "4/11/2019, 1:13:14 PM"
) зависит от реализации.Другими словами, не все браузеры согласятся с тем, как анализировать эти строки, а некоторые откажутся, предоставив Invalid Date
.
Анализатор объекта Date
всегда будет использовать пользователятекущая локальПоэтому, если вы в коде en-US
жестко закодировали языковой стандарт для *1040*, а затем проанализировали его в Великобритании, вы ошибочно переключили бы компоненты месяца и дня.11 апреля будет рассматриваться как 4 ноября.
Когда вы анализируете строку, которая выглядит как местное время, с объектом Date
, он будет справедливо предполагать, что это локальное время пользователя.зона.Есть последствия этого.Учтите, что вы можете передавать дату и время, которые действительны в America/New_York
, но недействительны в местном часовом поясе пользователя.Например, 31 марта 2019 года в 1:30 утра действителен в США, но будет недействительным в Великобритании, потому что он попадает в разрыв с переходной экономикой на летнее время (часы в Великобритании повысились с 00:59 до 02:00,пропуская этот час).В этом случае поведение не определено.Вы можете получить Invalid Date
или 00:30 или 02:30, но не получите 01: 30.
Если вы реконструировали Date
объектЕсли часовой пояс пользователя отличается от указанного, вы создаете совершенно другой момент времени.Если вы затем передадите этот объект Date
во что-то другое, вы не сможете понять, что вы имели в виду Восточное время США.В конечном итоге, Date
объекты не отслеживают даты, а хранят метку времени Unix, которая строго связана с UTC.Действительно, имя Date
сбивает с толку и неуместно (ИМХО).