Intl.DateTimeFormat () возвращает неверную дату для UTC - PullRequest
1 голос
/ 01 мая 2019

Я слежу за https://devhints.io/wip/intl-datetime

У меня тест, где:

const text = Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB')
expect(text).to.equal('Saturday, May 18, 2019, 16:00')

и функция:

dateToText(dateTime: string, lang: string[5]): string {
  const date = new Date(dateTime)
  let format = {
     timeZone: 'Europe/London',
     day: '2-digit',
     month: 'long',
     year: 'numeric',
     weekday: 'long',
     hour: '2-digit',
     minute: '2-digit',
     hour12: false
 }
 return new Intl.DateTimeFormat(lang, format).format(date)
}

Сбой теста:

AssertionError: ожидается 'Суббота, 18 мая 2019 года, 17:00 вечера' равно 'Суббота, 18 мая 2019 года, 16:00 вечера * (+ ожидается- фактическое)

  -Saturday, May 18, 2019, 17:00
  +Saturday, May 18, 2019, 16:00

Таким образом, согласно спецификации https://en.wikipedia.org/wiki/ISO_8601 Дата, Z является символом Зулу, который является часовым поясом Гринвича.Тогда я ожидал бы, что 2019-05-18T16:00:00Z - это все еще 4 вечера (16:00) для Europe/London.Важно, что я передаю дату именно в формате ISO.

Когда я удаляю Z с конца даты (что разрешено спецификацией ISO), я получаю правильный результат (16:00).Тем не менее, я хотел бы сохранить индикатор времени Zulu, поскольку именно так в моей базе данных хранится DateTime.

На моей локальной машине я нахожусь в часовом поясе Европы / Лондона.На моей другой машине тест проходит правильно, однако на Gitlab CI выдает ошибку.Это явно связано с часовыми поясами ...

Есть ли что-нибудь еще, что может объяснить, почему я получаю это несоответствие или что-то, что я пропустил?

1 Ответ

1 голос
/ 01 мая 2019

Британское летнее время работает с марта по октябрь, и для дат в течение этого времени, если отображается с использованием часового пояса «Европа / Лондон», они будут на 1 час опережать среднее время по Гринвичу.

То есть Utils.dateToText('2019-05-18T16:00:00Z', 'en-GB') (летнее время) правильно возвращает

Суббота, 18 мая 2019 года, 17:00

В то время как Utils.dateToText('2019-01-18T16:00:00Z', 'en-GB') (стандартное время) правильно возвращает

Пятница, 18 января 2019 года, 16:00

Обратите внимание на разницу во времени. Таким образом, тест не проходит правильно.

...