【问题标题】:Moment.js sets dates to 1 day behindMoment.js 将日期设置为晚 1 天
【发布时间】:2018-11-01 14:11:01
【问题描述】:

我正在使用 2.22.1 来格式化日期。

当我输入来自日期选择器的日期时,moment 会将日期放回一天。例如,当我尝试按以下方式格式化日期时:

示例 1:

const day = new Date(value).getDate();
const month = new Date(value).getMonth();
const fullYear = new Date(value).getFullYear();
console.log('day', day); // 7
console.log('month', month); // 5
console.log('fullYear', fullYear); //2018

格式化函数:

moment.utc(new Date(month + ' ' + day + ' ' + fullYear), 'MM-DD-YYYY').format('DD-MM-YY')

输出:06-05-18

预计:07-05-18

示例 2:

输入:2018 年 5 月 31 日星期四 00:00:00 GMT+0100(GMT 夏令时间)

格式化函数:

moment.utc(new Date(value)).format('DD-MM-YY')

输出:30-05-18 预计:31-05-18

【问题讨论】:

    标签: node.js momentjs


    【解决方案1】:

    moment.utc 会将输入转换为世界时。
    您正在使用基于 GMT +1 的输入运行 new Date(...)

    如果您考虑一下,这完全有道理。
    您的输出是 30-05-18,因为它是前一天晚上 11 点/23:00 点。

    这(无论如何)实际上会起作用:

    moment('05-06-2018', 'MM-DD-YYYY').format('DD-MM-YY')
    // alternatively (and preferrably) this:
    moment.utc('05-06-2018', 'MM-DD-YYYY').format('DD-MM-YY')
    

    并输出:"06-05-18"

    因为本例中非utc版本不需要时间输入。

    moment.js 存在的原因之一是在您的代码中一起删除 Date
    (请记住,Date 现在已经有了很大的改进。DateTimeFormat is a game changer
    请阅读 momentjs documentation 了解如何正确使用 moment。

    编辑: 如果你想用这个处理 400000 个日期,我建议使用 RegExp.split.exec.sliceDate
    (我可以联系起来,因为我使用 javascript generatorsService Workers 编写了一个客户端日志解析器,用于统计反作弊分析)
    我真的建议你玩这些东西来提高你的知识。

    【讨论】:

      【解决方案2】:

      我刚刚遇到了这个问题,我发现在“祖鲁时间”中处理的时间(由于字符串末尾的 Z)的快速修复是在日期变量之后添加 .LocaleString()

      我发现为了数据的一致性,以UTC时间存储数据,然后在向用户显示数据时将其转换为区域设置字符串会更容易。

      例如,我正在使用:

      moment.utc(dateVariable.toLocaleString()).format("MM/DD/YYYY")
      

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多