时刻时区:本地时区应用于已解析的日期,但不适用于格式()

Moment timezone: Local Timezone gets applied to parsed date but not on format()

上下文:我有一个服务器托管在云中的虚拟机上。当仅使用 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 日期,我们可以使用时区名称“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>