#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
конструктора. В остальном ваш код в порядке.
Если это кажется немного громоздким, этого следует ожидать. Это улучшит ситуацию, но пока она не будет доступна, вы можете сделать это либо таким образом, либо с помощью библиотек.
Ответ №2:
Вы можете попробовать toLocaleDateString, так как формат, который вам нужен, задан языком en-CA (и, возможно, другими).:
console.log(
new Date('2021-07-06T01:00:00.000Z').toLocaleDateString('en-CA')
);
Предостережение с любым методом toLocale* заключается в том, что вы не гарантируете, что все реализации вернут один и тот же формат и могут вернуться к некоторому формату, зависящему от реализации. Так что не используйте его, если это имеет значение.