时区时区:本地时区应用于解析日期,但不适用于format

问题描述

上下文:我有一台服务器托管在云中的VM上。当仅使用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()函数会格式化另一个小时?

有人可以解释一下它是如何工作的吗?

解决方法

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

我想您已经记录了以下内容:

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

toISOString()输出日期的UTC时间,因此这正是我们所期望的。布加勒斯特的18:30(一年中的这个时间)对应世界标准时间15:30。

要解析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>