Перемотка вперед к 2015 году, когда дело доходит до форматирования даты из другого часового пояса с использованием определенной локали , есть две опции.
В этом примере я используюФранцузская локаль и будет использовать (UTC + 5) дату 27 марта 2016 года, 2 ч 15 , которая не наблюдается в Западной Европе (из-за изменения летнего времени , часы перемещаются с 2 ч 3 до 3 ч), который является общим источникомошибки.
Для максимальной переносимости используйте библиотеку moment.js .Момент наступает со связанными 80 + локалями .
Использование отметки времени и смещения UTC:
moment(1459026900000).utcOffset(300).locale('fr').format("LLLL")
// "dimanche 27 mars 2016 02:15"
Использование массивацелых чисел (обратите внимание, что в данный момент месяц основан на 0, как в собственном объекте JS Date)
moment.utc([2016,3-1,27,2,15]).locale('fr').format("LLLL")
// "dimanche 27 mars 2016 02:15"
Вы можете протестировать эти методы, запустив код в браузереdev tools on http://momentjs.com/
Сложность здесь заключается в использовании moment.utc
, который создает объект даты-момента с флагом UTC, что означает, что при форматировании этой даты она не будет преобразована в пользователячасовой пояс, но отображается как есть (и поскольку UTC не наблюдает летнее время, он не подвержен ошибкам летнего времени).
Будущее собственное решение: использование Intl
object
(обратите внимание, что по состоянию на конец 2015 года это решение поддерживается Chrome, Firefox, IE11, но все еще не поддерживается в Safari 9 )
Использование массива целых чисел:
new Intl.DateTimeFormat('fr-FR', { timeZone: 'UTC', weekday: 'long',
month: 'long', year: 'numeric', day: 'numeric', hour: 'numeric',
minute: 'numeric' })
.format(Date.UTC(2016,3-1,27,2,15))
// "dimanche 27 mars 2016 02:15"
Здесь снова нужно использовать Date.UTC
и timeZone: 'UTC'
, чтобы убедиться, что указанная дата не будет соответствоватьпереведено на локальный часовой пояс пользователя.
Обратите внимание, что в обоих случаях мы используем методы UTC, просто чтобы убедиться, что дата будет использоваться как есть, без преобразований.Однако важно понимать, что эти даты являются поддельными датами UTC (они представляют время в заданном произвольном часовом поясе, а не временем UTC) и должны использоваться только для форматирования и отображения даты - их не следует передавать.