将节点/JavaScript中的日期格式化为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,我不想只为这一项任务添加另一个日期/时间

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

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)

  • 解析日期以获取UTC字符串
  • 格式中的新日期(parsedDate)将重新将utc转换为您的时区

    您的问题是:

    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
    ,这是UTC
    isDate()
    在此字段上返回
    true
    。当我将其传递到
    format()
    时,是get
    15 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