Node/JavaScript 格式的日期为 UTC

Formatted dates in Node/JavaScript to UTC

我正在使用 Node/Express 服务器在将日期发送到浏览器之前对其进行格式化。我的日期在数据库中保存为 UTC,例如:

2020-09-15 11:52:22.000

我现在想格式化这个日期,不改变它,并将它发送到浏览器,所以无论 Node 服务器在哪里,无论浏览器在哪里,它总是显示这个 UTC 日期。查看此日期的人将来自美国、英国、欧盟,但我希望他们都看到相同的 UTC 日期。

我在英国,我正在使用 date-fns,目前我是 运行 本地节点。我的应用程序已经使用了 date-fns,我不想只为这个任务添加另一个 date/time 依赖项。

如果我这样做:

const d = format(new Date('2020-09-15 11:52:22.000'), 'dd MMM yyyy HH:mm:ss')

我得到:15 Sep 2020 12:52:22...这是我当地时间(英国,BST)的日期。

如果有一件事让我感到困惑,那就是日期和时间! :-)

在 Node 中,如何获取 2020-09-15 11:52:22.000 并将其格式化为 15 Sep 2020 11:52:22 ..?

你应该使用https://momentjs.com/

例如:

moment().format('Do MMMM YYYY, h:mm:ss');

你可以尝试这样做(我的时区是 +2 GTM)

  1. 解析您的日期以获得 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');

格式中的新日期 (parsedDate) 会将 utc 重新转换为您的时区

您的问题是:

new Date('2020-09-15 11:52:22.000')

强烈建议不要对不受支持的格式使用内置解析器。它依赖于实现,并且通常 returns 在不同的实现中会产生不同的结果。

此外,该字符串没有时区,因此应被视为本地时区。因此,即使解析正确,它也会代表每个具有不同偏移量的地点的不同时刻。

Date-fns 有一个强大的 parser 所以你应该使用它而不是内置的 paser。如果您希望将时间戳视为 UTC,最简单的方法是添加尾随“Z”和时区标记进行解析。

要支持输出时区,您必须包含 date-fns-tz. Following is some code you can run at 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.