【问题标题】:Moment timezone: Local Timezone gets applied to parsed date but not on format()时刻时区:本地时区应用于解析日期,但不适用于 format()
【发布时间】:2020-12-06 12:38:36
【问题描述】:

上下文:我在云中的虚拟机上托管了一台服务器。当只使用moment 库来初始化日期时,我总是得到一个有 +- 几个小时的日期。经过快速研究,我找到了moment-timezone 库,它应该可以解决这个问题,但我遇到了一些问题。

我有以下日期:"transactionDate": "2020-08-25 18:30:00" 已提交。

我的代码现在看起来像这样,其中 moment 现在是 moment-timezone 库:

  const momentTransactionDate = moment.tz(transactionDate, "YYYY-MM-DD HH:mm:ss", "Europe/Bucharest");

  const formattedTransactionDate = momentTransactionDate.format(
    "YYYY-MM-DD HH:mm:ss"
  );

这将输出以下值:

    "momentTransactionDate": "2020-08-25T15:30:00.000Z",
    "formattedTransactionDate": "2020-08-25 18:30:00",

为了测试,我只是从 Postman 向本地服务器发出请求。 为什么momentTransactionDate 是3 小时前,format() 函数为什么格式化不同的时间?

有人能解释一下这是如何工作的吗?

【问题讨论】:

    标签: javascript momentjs moment-timezone


    【解决方案1】:

    momentTransactionDate 对象被指定为布加勒斯特时间,因此它将比 UTC 时间早三个小时(在 DST 中,https://www.timeanddate.com/time/zones/eest)。

    我假设您已经记录了这样的内容:

    console.log( { momentTransactionDate: momentTransactionDate.toISOString(), formattedTransactionDate});
    

    toISOString() 输出日期的 UTC 时间,所以这正是我们所期望的。布加勒斯特的 18:30(每年的这个时候)对应于 15:30 UTC 时间。

    为了解析 UTC 日期,我们可以使用“UTC”的时区名称:

    const transactionDate = "2020-08-17 17:30:00";
    const momentTransactionDate = moment.tz(transactionDate, "YYYY-MM-DD HH:mm:ss", "UTC");
    
    const formattedTransactionDate = momentTransactionDate.format(
        "YYYY-MM-DD HH:mm:ss"
    );
    
    console.log("momentTransactionDate.toISOString():", momentTransactionDate.toISOString());
    console.log("formattedTransactionDate:", formattedTransactionDate); 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.25/moment-timezone-with-data-10-year-range.js"></script>

    【讨论】:

    • 我已经登录了toString()。谢谢,确实有道理。也许我做错了。我试图保持与创建moment 对象时传入的日期相同。我怎样才能做到这一点?我认为取决于服务器的托管位置,当创建时刻对象时,我的时间得到了我试图解决的 +- 时间。
    • 我有点困惑。我认为答案是肯定的。交易日期来自日期选择器或导入的文档。我真的不关心时区。我想保持原样
    • 没错,moment 将假定日期为服务器本地时间,除非 'Z' UTC 区域指示符位于末尾。
    • 谢谢。 moment.tz(transactionDate, "YYYY-MM-DD HH:mm:ss", "UTC"); 的方法确实有效。至于2020-08-17T18:00:00Z,可能还必须更改日期解析格式以考虑T(时间?)和Z(区域?)。即使用它初始化了时刻对象,在我调用 .format 函数之后,它仍然会返回一个日期,该日期有 +- 几个小时 - 可能是 UTC 和服务器之间的差异。
    • 太好了,很高兴看到我们有解决方案!抱歉,您是对的,即使我们使用 UTC 时间戳初始化日期/时刻,它仍然是本地时间。但是,您可以使用 moment.utc('2020-08-17T18:00:00Z') 它应该做你想做的事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多