3 回答
TA贡献1828条经验 获得超13个赞
你的问题是:
new Date('2020-09-15 11:52:22.000')
强烈建议不要对不受支持的格式使用内置解析器。它依赖于实现,并且通常在不同的实现中返回不同的结果。
此外,该字符串没有时区,因此应被视为本地时区。因此,即使解析正确,对于具有不同偏移量的每个地点,它也会代表不同的时间点。
Date-fns 有一个功能强大的解析器,所以你应该使用它而不是内置的解析器。如果您希望将时间戳视为 UTC,最简单的方法是添加尾随“Z”和时区标记以进行解析。
要支持输出时区,您必须包含date-fns-tz。以下是您可以在npm.runkit运行的一些代码。格式部分似乎产生了正确的结果,但是如果将时区标记添加到格式字符串(即“X”或“XX”),它会显示本地时区偏移量,而不是应用于字符串的时区偏移量,以便显示正确偏移,你必须手动添加它(我认为这是 date-fns-tz 中的一个错误)。
const dateFns = require("date-fns");
const { zonedTimeToUtc, utcToZonedTime, format } = require('date-fns-tz');
let timestamp = '2020-09-15 11:52:22.000';
let tz = 'Z';
let date = dateFns.parse(timestamp + tz, 'yyyy-MM-dd HH:mm:ss.SSSX', new Date());
// Show timestamp was parsed as UTC
console.log(date.toISOString()); // 2020-09-15T11:52:22.000Z
// Produce UTC output - need to set timezone first
let utcDate = utcToZonedTime(date, 'UTC');
// Manually add timezone to formatted string
console.log(format(utcDate, 'd MMM yyyy HH:mm \'UTC\'', 'UTC')); // 15 Sep 2020 11:52 UTC
请注意,utcToZonedTime(date, 'UTC')实际上创建了一个由指定偏移量修改的新日期并将其分配给utcDate,我认为这是一个真正的问题。如果您知道它是如何被修改的,它现在才有用,您不知道它实际应该代表什么时间。在这种情况下,它可能很清楚,因为我们使用的是 UTC,但其他偏移量问题更大。
如果初始时间戳采用 ECMAScript 支持的格式,例如与toISOString生成的格式相同:2020-09-15T11:52:22.000Z,将会节省很多精力。
TA贡献1810条经验 获得超4个赞
您可以尝试这样做(我的时区是 +2 GTM)
解析您的日期以获得 UTC 字符串
const parsedDate = parse('2020-09-15 11:52:22.000', 'yyyy-MM-dd HH:mm:ss.SSS', new Date()).toUTCString();
// Tue, 15 Sep 2020 09:52:22 GMT
// or simply
// new Date('2020-09-15 11:52:22.000').toUTCString();
// format a new date starting from UTC format
// new Date(parsedDate) --> Tue Sep 15 2020 11:52:22 GMT+0200
const date = format(new Date(parsedDate), 'dd MMM yyyy HH:mm:ss');
格式中的新 Date(parsedDate) 会将 utc 重新转换为您的时区
添加回答
举报