将节点/JavaScript中的日期格式化为UTC
在将日期发送到浏览器之前,我正在使用Node/Express服务器格式化日期。我在数据库中保存的日期为UTC,例如:将节点/JavaScript中的日期格式化为UTC,javascript,node.js,date,date-fns,Javascript,Node.js,Date,Date Fns,在将日期发送到浏览器之前,我正在使用Node/Express服务器格式化日期。我在数据库中保存的日期为UTC,例如: 2020-09-15 11:52:22.000 现在,我希望格式化此日期,而不更改它,并将其发送到浏览器,因此无论节点服务器在哪里,也不管浏览器在哪里,它始终显示此UTC日期。查看此日期的人将在美国、英国、欧盟,但我希望他们都看到相同的UTC日期 我在英国,我正在使用日期fns,目前我正在本地运行Node。我的应用程序已经使用了日期fns,我不想只为这一项任务添加另一个日期/时间
2020-09-15 11:52:22.000
现在,我希望格式化此日期,而不更改它,并将其发送到浏览器,因此无论节点服务器在哪里,也不管浏览器在哪里,它始终显示此UTC日期。查看此日期的人将在美国、英国、欧盟,但我希望他们都看到相同的UTC日期
我在英国,我正在使用日期fns
,目前我正在本地运行Node。我的应用程序已经使用了日期fns
,我不想只为这一项任务添加另一个日期/时间依赖项
如果我这样做:
const d=格式(新日期('2020-09-15 11:52:22.000'),'dd-MMM-yyy HH:mm:ss')
我得到:2020年9月15日12:52:22
。。。这是我当地时间(英国夏令时,英国夏令时)的日期
如果有一件事让我困惑的话,那就是日期和时间
在节点中,我如何获取2020-09-15 11:52:22.000
并将其格式化为15 Sep 2020 11:52:22
。?您应该使用
例如:
moment().format('Do-MMMM-YYYY,h:mm:ss');
您可以尝试这样做(我的时区为+2 GTM)
new Date('2020-09-15 11:52:22.000')
强烈反对对不支持的格式使用内置解析器。它依赖于实现,通常在不同的实现中返回不同的结果
此外,字符串没有时区,因此应视为本地字符串。因此,即使正确解析,它也将在时间上为每个具有不同偏移量的位置表示不同的时刻
Date fns有一个capable,因此您应该使用它而不是内置paser。如果希望将时间戳视为UTC,最简单的方法是添加一个尾随的“Z”和时区标记进行解析
要支持输出时区,必须包括。下面是一些可以运行的代码。格式部分似乎产生了正确的结果,但是如果将时区标记添加到格式字符串(即“X”或“XX”),它将显示本地时区偏移量,而不是应用于字符串的偏移量,因此要正确显示偏移量,您必须手动添加它(我认为这是日期fns tz中的错误)
请注意,utcToZonedTime(date,'UTC')
实际上创建了一个由指定偏移量修改的新日期,并将其分配给utcDate,我认为这是一个真正的难题。只有当你知道它是如何被修改的,你不知道它实际上应该代表什么时间,它现在才有用。在这种情况下,可能很清楚,因为我们使用的是UTC,但其他偏移量的问题要大得多
如果初始时间戳采用ECMAScript支持的格式,例如与toISOString:2020-09-15T11:52:22.000Z生成的格式相同,则可以节省大量工作。请参阅此处的答案,可能会有所帮助:。通常情况下,如果是UTC,则日期末尾有一个
Z
。我猜这个数据库上的日期字段是一种时区没有实际保存的类型。谢谢!但我希望使用本机JavaScript或使用date fns
,而不是moment
,来实现这一点。我的项目已经有了日期fns
作为依赖项,并且它在其他任何地方都可以使用。我不想为这个非常小的任务添加一个新的依赖项,特别是像时刻
这样大的依赖项。看起来这个时刻即将结束:谢谢@RobG。。。我使用的是datefns
2.14.0,您的示例使用的是1.28.5。看来事情变了parse()
现在需要第三个参数。然而,我想做的是格式化我的日期。看起来像是format()
转换为本地时间,即使您传入的日期对象是UTC。GrrrrrI这里有一个日期对象,当打印到控制台时显示:2020-09-15T13:44:46.000Z
,这是UTCisDate()
在此字段上返回true
。当我将其传递到format()
时,是get15 Sep 2020 14:44:46
。。。!这不再是UTC,而是BST(+1小时)@StephenLast更新了date fns当前版本的代码,并提供了更好的解释。对不起,以前的垃圾,我不应该张贴时,匆忙的时间…
new Date('2020-09-15 11:52:22.000')
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