date-fns 将 UTC 转换为时区

Posted

技术标签:

【中文标题】date-fns 将 UTC 转换为时区【英文标题】:date-fns convert utc to timezone 【发布时间】:2021-08-01 15:39:04 【问题描述】:

我正在尝试使用 Nodejs 中的 date-fns 将 utc 时间解析为时区

    const date = new Date('2018-09-01T16:01:36.386Z');
    const timeZone = 'Europe/Berlin';
    const zonedDate = utcToZonedTime(date, timeZone);
    // zonedDate could be used to initialize a date picker or display the formatted local date/time

    // Set the output to "1.9.2018 18:01:36.386 GMT+02:00 (CEST)"
    const pattern = "d.M.yyyy HH:mm:ss.SSS 'GMT' XXX (z)";
    const output = format(zonedDate, pattern,  timeZone: 'Europe/Berlin' );
    console.log(output);

我正在使用文档中的此代码来检查我的问题,但它并没有像文档所说的那样打印。 这是输出:

1.9.2018 18:01:36.386 GMT Z (GMT+0)

我不知道为什么时间部分会改变,但时区仍然是 UTC。应该是:

1.9.2018 18:01:36.386 GMT+02:00 (CEST)

注意:我只是使用这个示例代码来显示我的问题

节点 14.16.0 日期-fns:2.21.3 日期-fns-tz:1.1.4

【问题讨论】:

【参考方案1】:

我得到了所需的输出(或非常相似的输出),我想知道为什么您会看到 GMT Z (GMT+0) 的时区。在我看来,这与您的操作系统/环境有关。

const  zonedTimeToUtc, utcToZonedTime, format  = require('date-fns-tz')
const os = require('os');

const date = new Date('2018-09-01T16:01:36.386Z');
const timeZone = 'Europe/Berlin';
const zonedDate = utcToZonedTime(date, timeZone);
// zonedDate could be used to initialize a date picker or display the formatted local date/time

// Set the output to "1.9.2018 18:01:36.386 GMT+02:00 (CEST)"
const pattern = "d.M.yyyy HH:mm:ss.SSS 'GMT' XXX (z)";
const output = format(zonedDate, pattern,  timeZone: 'Europe/Berlin' );
console.log(output);

console.log("Node version:", process.version)
console.log("Os:", os.version() + " - " + os.release())

我看到的输出是:

1.9.2018 18:01:36.386 GMT +02:00 (GMT+2)
Node version: v14.15.5
Os: Windows 10 Pro - 10.0.19041

这是在 Windows 机器上。

包版本是:

"date-fns": "^2.21.3",
"date-fns-tz": "^1.1.4"

在 Ubuntu (replit.com) 上试用它,我看到以下内容:

1.9.2018 18:01:36.386 GMT +02:00 (GMT+2)
Node version: v12.22.1
Os: #45-Ubuntu SMP Tue Apr 13 01:44:53 UTC 2021 - 5.4.0-1042-gcp

【讨论】:

嗯,很奇怪 我还是不明白为什么会这样 这似乎有点神秘,我无法复制这种行为。我建议将您的操作系统详细信息添加到问题中,以便有人可以重现该问题! 我发布了我的答案,这是我的错误。感谢您的回复【参考方案2】:

没有检查导入语句是我的错。应该是

import  format  from 'date-fns-tz';

我用过这个:

import  format  from 'date-fns';

在 vscode 上使用自动导入时有点混乱。

【讨论】:

很高兴看到您发现了问题!

以上是关于date-fns 将 UTC 转换为时区的主要内容,如果未能解决你的问题,请参考以下文章

传递列以转换为时区值

Jooq java api,在选择查询中将日期时间转换为时区

将纪元时间(以毫秒为单位)转换为时间戳到 UTC 错误

在 Redshift 中,如何使用 UTC 时区将 current_timestamp 转换为时间戳?

如何将 UTC 时间转换为本地时间

将 Unix 时间戳转换为时区?