【问题标题】:moment.js returns next daymoment.js 第二天返回
【发布时间】:2018-07-04 11:11:15
【问题描述】:

我正在解析这样的日期。时刻的语言环境设置为德国:

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 月 1 日),而且它们运行良好!

我相信这不是 UTC。

这里发生了什么?

【问题讨论】:

  • “我相信这不是 UTC 的事情。”但是您解析的时间戳是 UTC,而德国是提前一小时。
  • 即使您没有将语言环境设置为德国,也会发生这种情况。如果小时小于 22,则打印正确的结果。
  • 哦,我不敢相信我错过了那篇.....

标签: date parsing momentjs days


【解决方案1】:

您的输入以Z 结尾,因此它被视为UTC。

改用moment.utc

默认情况下,moment 解析并显示为当地时间。

如果要解析或显示 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多