moment.js возвращается на следующий день

Я разбираю дату, как это. Локаль момента установлена ​​​​в Германии:

moment("2030-12-31T23:59:59.000Z")

Однако, когда я распечатаю его, он выберет на следующий день:

moment("2030-12-31T23:59:59.000Z").format('L')
-> "01.01.2031"

Вот как выглядит объект момента после синтаксического анализа, и мы можем ясно видеть, что проанализированная дата верна:

Moment {_isAMomentObject: true, _i: "2030-12-31T23:59:59.000Z", _f: "YYYY-MM-DDTHH:mm:ss.SSSSZ", _tzm: 0, _isUTC: false, …}
_d
:
Wed Jan 01 2031 00:00:00 GMT+0100 (CET) {}
_f
:
"YYYY-MM-DDTHH:mm:ss.SSSSZ"
_i
:
"2030-12-31T23:59:59.000Z"
_isAMomentObject
:
true
_isUTC
:
false
_isValid
:
true
_locale
:
Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _ordinal: "%d.", _ordinalParse: /\d{1,2}\./, …}
_pf
:
charsLeftOver
:
0
empty
:
false
invalidFormat
:
false
invalidMonth
:
null
iso
:
true
meridiem
:
undefined
nullInput
:
false
overflow
:
-1
parsedDateParts
:
(7) [2030, 11, 31, 23, 59, 59, 0]
unusedInput
:
[]
unusedTokens
:
[]
userInvalidated
:
false
__proto__
:
Object
_tzm
:
0
__proto__
:
Object

Как ни странно, я анализирую еще 2-3 даты точно так же (большинство 1 января какого-то года), и они отлично работают!

Я считаю, что это не UTC.

Что здесь происходит?


person Matthias Max    schedule 25.01.2018    source источник
comment
Я считаю, что это не UTC. Но временная метка, которую вы анализируете, находится в формате UTC, а Германия на один час вперед.   -  person tkausl    schedule 25.01.2018
comment
Это происходит, даже если вы не устанавливаете языковой стандарт для Германии. Если час меньше 22, он печатает правильный результат.   -  person itdoesntwork    schedule 25.01.2018
comment
О, я не могу поверить, что пропустил этот кусок .....   -  person Matthias Max    schedule 25.01.2018


Ответы (1)


Ваш ввод заканчивается на Z, поэтому он считается UTC.

Вместо этого используйте moment.utc:

По умолчанию момент анализирует и отображает по местному времени.

Если вы хотите проанализировать или отобразить момент в формате UTC, вы можете использовать moment.utc() вместо moment().

moment.locale('de');
var m1 = moment.utc("2030-12-31T23:59:59.000Z").format('L');
console.log(m1);
var m2 = moment("2030-12-31T23:59:59.000Z").format('L');
console.log(m2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment-with-locales.min.js"></script>

person VincenzoC    schedule 25.01.2018