Преобразование даты и времени JavaScript UTC в локальное ГГГГ-ММ-ДД

#javascript #date #datetime #timezone #iso8601

Вопрос:

Я получаю данные из базы данных в виде строки даты и времени ISO-8601 в формате UTC, а затем мне нужно преобразовать их в локальную строку даты в формате ГГГГ-ММ-ДД.

Этот код работает, но мне интересно, есть ли лучший способ сделать это…

 const zeroPad = n => n < 10 ? '0'   n : n
const d = new Date('2021-07-06T01:00:00.000Z') // UTC 1 AM
const month = zeroPad(d()   1)
const date = zeroPad(d())
const result = `${d.getFullYear()}-${month}-${date}`
console.log(result); // US/Eastern 8 PM - date is 1 day earlier
 

Это кажется немного громоздким, но я пытаюсь избежать накладных расходов на внешние библиотеки.

Есть какие-нибудь мысли?

Ответ №1:

Вторая строка является избыточной. Date Объект изначально основан на UTC. Преобразование в локальный часовой пояс браузера фактически не происходит до каждого вызова getMonth , getDate , и getFullYear . Таким образом, вам не нужны два отдельных вызова Date конструктора. В остальном ваш код в порядке.

Если это кажется немного громоздким, этого следует ожидать. Это улучшит ситуацию, но пока она не будет доступна, вы можете сделать это либо таким образом, либо с помощью библиотек.

Кстати, ваш комментарий неверен. Лондон-UTC 1 в июле по британскому летнему времени, поэтому для этой метки времени на основе UTC в Лондоне будет 2 часа ночи.

Ответ №2:


Вы можете попробовать toLocaleDateString, так как формат, который вам нужен, задан языком en-CA (и, возможно, другими).:

 console.log(
  new Date('2021-07-06T01:00:00.000Z').toLocaleDateString('en-CA')
); 

Предостережение с любым методом toLocale* заключается в том, что вы не гарантируете, что все реализации вернут один и тот же формат и могут вернуться к некоторому формату, зависящему от реализации. Так что не используйте его, если это имеет значение.