Что является стандартом для кодирования даты в качестве временной метки? - PullRequest
0 голосов
/ 07 ноября 2019

Существует ли стандарт для кодирования даты в качестве временной метки? Мои мысли:

  1. Это должно быть 12: 00 UTC по местному времени , например, 9:00 утра в Т-3, поэтому любой, кто использует метку времени, независимо от ихСмещение -12 / + 12, распознает одну и ту же дату, независимо от того, анализируются ли они в часовом поясе UTC

  2. Это может быть 12: 00 вечера в UTC

  3. Это может быть начало дня (12:00 утра) в UTC

  4. Это может быть началодня (12:00 по UTC) по местному времени, например, 21:00 в T-3


Есть ли официальная спецификация или стандарт, которого следует придерживаться?

Было бы легко указать на этот документ и сказать «это стандарт», в отличие от того, что он не знает и вынужден изменить нашу логику.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Для этого нет стандарта, потому что дата и отметка времени являются логически двумя очень разными понятиями.

  • Дата охватывает весь диапазон времени в этом дне, а не конкретную точкуво времени.
  • Это может быть другая дата для человека в другом часовом поясе в любой данный момент времени, но сами даты не связаны с часовыми поясами. Визуализируйте дату как квадрат в календаре, а не точку на временной шкале.
  • Многие API будут использовать полночь (00:00) в качестве времени по умолчанию, когда для даты назначено значение только для даты +значение времениОднако:
    • Будь то UTC или местное время, очень зависит от этого конкретного API. Для этого нет стандарта, и при этом один ответ не обязательно лучше другого.
    • Назначение полуночи по местному времени может быть проблематичным для часовых поясов с переходами около полуночи. Например, в Сантьяго, Чили, 2019-09-08 , день начался в 01:00 из-за начала летнего времени. В этот день не было 00:00.

Кроме того, вы отметили свой вопрос momentjs. Поскольку объект Moment в основном является меткой времени (а не датой), Moment.js обычно назначает начало дня, если предоставлено значение только для даты. Используемый часовой пояс является ключом к решению, какой момент на самом деле, который иллюстрирует мои предыдущие моменты.

Например:

// Parsing as UTC
moment.utc('2019-09-08').format() //=> "2019-09-08T00:00:00Z"

// Parsing as Local Time (my local time zone is US Pacific Time)
moment('2019-09-08').format() //=> "2019-09-08T00:00:00-07:00"

// Parsing in a specific time zone (on a day without midnight)
moment.tz('2019-09-08', 'America/Santiago').format() //=> "2019-09-08T01:00:00-03:00"

Также имейте в виду, что иногда API могут быть названы неправильно. Объект JavaScript Date является не только значением даты, но фактически отметкой времени, как момент.

0 голосов
/ 08 ноября 2019

Я просто хочу опубликовать наш ответ:

  1. кодировать начало дня UTC
moment.utc(moment(date).format('YYYY-MM-DD')).toISOString();
декодировать в часовом поясе UTC (так что любой, использующий приложение, увидит ту же дату)
moment.utc(timestamp)

Если наш API возвращает поле со словом «date» в нем (например, endDate), мы будем анализировать в UTC, в противном случае мы будем анализировать как фактическую (локальную) метку времени, например, lastUpdatedAt

...