【问题标题】:Why does Moment.JS not parse 24 hour dates correctly为什么 Moment.JS 不能正确解析 24 小时日期
【发布时间】:2014-06-14 23:18:35
【问题描述】:

每当我使用 moment.js 和 node 解析日期时,它都比它应该的时间晚了 12 个小时。考虑以下测试:

var moment = require('moment');

var dt1 = moment('14:00, 10 Jun 2014', 'HH:mm, DD MMM YYYY').toDate();
console.log('dt1:' + JSON.stringify(dt1, null, 4));

var dt2 = moment('02:00, 10 Jun 2014', 'HH:mm, DD MMM YYYY').toDate();
console.log('dt2:' + JSON.stringify(dt2, null, 4));

它给出了输出:

dt1:"2014-06-10T02:00:00.000Z"
dt2:"2014-06-09T14:00:00.000Z"

它几乎就像它使用一些疯狂的时区解析它,而不仅仅是按照我的意愿解析我当地时区的日期,我认为这将是默认行为。

我怎样才能让它正常工作?

【问题讨论】:

  • 输出中的Z 代表Zulu or UTC time 并包含在内,因为Dates 是stringified with toISOString()
  • 我要做的就是解析上面相当奇怪的文本日期,然后将其作为 DateTime 字段输入 MongoDB。如果你能解释一下如何让当地日期暂时消失,我会接受它作为答案

标签: javascript node.js momentjs


【解决方案1】:

像下面这样试试

var dt1 = moment('14:00, 10 Jun 2014', 'HH:mm, DD MMM YYYY').format('HH:mm, DD MMM YYYY');

【讨论】:

    【解决方案2】:

    Moment.js 工作正常。您的问题的根源是将日期转换为 UTC 的 JSON.stringify。所以你需要将你的时区添加到时间戳来解决这个问题。最简单的方法是将您的第一个矩对象变形为第二个对象以更改格式并使用不带参数的格式调用设置默认格式(在此处查找默认格式)。

    moment(moment('02:00, 10 Jun 2014', 'HH:mm, DD MMM YYYY').toDate()).format();
    

    更新:

    @MattJohnson 发现它更简单。不知道为什么它以前对我不起作用,但它只是需要:

    moment('02:00, 10 Jun 2014', 'HH:mm, DD MMM YYYY').format()
    

    【讨论】:

    • format 函数是这里的关键。不需要将这一刻包裹在另一刻。
    • 我只是在回答之前检查了这个,发现 moment.format() 不适用于不遵循 ISO-8601 格式的日期。所以需要它。
    • 奇怪。我会检查一下我上次得到了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多