如何解决将Node / JavaScript中的日期格式化为UTC
我正在使用Node / Express服务器格式化日期,然后再将其发送到浏览器。我的日期以UTC格式保存在数据库中,例如:
2020-09-15 11:52:22.000
我现在想格式化该日期而不更改它,并将其发送给浏览器,因此无论Node服务器在哪里,也不在浏览器在哪里,它总是显示该UTC日期。查看此日期的人将在美国,英国,欧盟,但我希望他们都能看到相同的UTC日期。
我在英国,正在使用date-fns
,目前正在本地运行Node。我的应用程序已经使用date-fns
,并且我不想为此任务添加另一个日期/时间依赖项。
如果我这样做:
const d = format(new Date('2020-09-15 11:52:22.000'),'dd MMM yyyy HH:mm:ss')
我得到:15 Sep 2020 12:52:22
...那是我当地时间(英国,英国夏令时)的日期。
如果有一件事让我感到困惑,那就是日期和时间! :-)
在Node中,如何获取2020-09-15 11:52:22.000
并将其格式化为15 Sep 2020 11:52:22
..?
解决方法
您的问题是:
new Date('2020-09-15 11:52:22.000')
强烈建议不要将内置的解析器用于不受支持的格式。它依赖于实现,并且在不同的实现中通常会返回不同的结果。
此外,字符串没有时区,因此应将其视为本地。因此,即使解析正确,每个位置的偏移时间也将代表不同的时刻。
Date-fns具有强大的parser,因此您应该使用它而不是内置的paser。如果要将时间戳记视为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。
,您可以尝试执行此操作(我的时区为+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转换为您的时区
,例如:
moment().format('Do MMMM YYYY,h:mm:ss');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。