问题描述
上下文:我有一台服务器托管在云中的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>