Подтвердить что ты не робот

Moment.js - UTC дает неверную дату

Почему time.js UTC всегда показывает неправильную дату. Например, из консоли Chrome:

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

Оба из них вернут "2013-07-17" , почему он возвращает 17th вместо 18th, который был передан.

Но если я использую momentjs без utc:

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

Я возвращаюсь "2013-07-18" , что и я ожидаю при использовании момента времени. js UTC.

Означает ли это, что мы не можем получить правильную дату при использовании момента времени. js UTC?

4b9b3361

Ответ 1

По умолчанию MomentJS анализирует по местному времени. Если предоставляется только строка даты (без времени), по умолчанию используется значение по умолчанию до полуночи.

В вашем коде вы создаете локальную дату, а затем конвертируете ее в часовой пояс UTC (фактически, он переключает экземпляр экземпляра на режим UTC), поэтому когда он отформатирован, он сдвигается (в зависимости от вашего локального времени) вперед или назад.

Если локальный часовой пояс UTC + N (N - положительное число), и вы анализируете строку только для даты, вы получите предыдущую дату.

Вот несколько примеров, чтобы проиллюстрировать это (мое местное смещение по времени - UTC + 3 во время DST):

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

Если вы хотите, чтобы строка даты и времени интерпретировалась как UTC, вы должны быть явным:

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

или, как упоминает Мэтт Джонсон в своем ответе, вы можете (и, вероятно,) разобрать его как дату UTC, используя moment.utc() и включить строку формата в качестве второго аргумента, чтобы предотвратить неоднозначность.

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

Чтобы перейти на другую сторону и преобразовать дату UTC в локальную дату, вы можете использовать метод local() следующим образом:

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"

Ответ 2

Оба Date и moment будут анализировать входную строку в локальном часовом поясе браузера по умолчанию. Однако Date иногда не согласуется с этим. Если строка конкретно YYYY-MM-DD, используя дефисы, или если она YYYY-MM-DD HH:mm:ss, она будет интерпретировать ее как локальное время. В отличие от Date, moment всегда будет соответствовать тому, как он анализирует.

Правильный способ анализа времени ввода в формате UTC в указанном вами формате будет таким:

moment.utc('07-18-2013', 'MM-DD-YYYY')

Обратитесь к этой документации.

Если вы хотите отформатировать его по-разному для вывода, вы сделаете следующее:

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

Вам не нужно явно вызывать toString.

Обратите внимание, что очень важно предоставить формат ввода. Без него дата, подобная 01-04-2013, может обрабатываться как 4 января, так и 1 апреля, в зависимости от настроек культуры браузера.