date-fns-tz 解析日期戳,就好像它在特定时区一样

date-fns-tz parse a datestamp as if it was in a specific timezone

提问人:douliman 提问时间:9/27/2023 最后编辑:douliman 更新时间:9/27/2023 访问量:51

问:

我经常想要在特定时区中提取与时区无关的日期戳的UTC时间。我不想将图章“转换”到目标时区,我希望库假设此日期戳已经在目标时区,并给我它所在的UTC时间。

假设我的时区是:欧洲/阿姆斯特丹

我想要: '2023-09-26 00:00:00' 在美国/New_York。所以我想告诉图书馆“这个日期是美国/New_York 年 9 月 26 日 23 日的午夜。什么是正确的 Unix 时间戳?

我尝试的任何策略最终都会将该时间转换为目标时区中的不同时间。(GMT+2 至 GMT-4)。由于夏令时,我无法向原始日期戳添加时区偏移量。抵消量全年都在变化。

有人有这方面的策略吗?

编辑。我想出了点什么,但感觉很疯狂。一定有更好的方法吗?

const stamp = '2023-09-26 00:00:00';
// correct time, but wrong TZ
const wrongTz = dateFns.parse(stamp, 'yyyy-MM-dd HH:mm:ss', new Date());
// correct time, TZ, but wrong Unix timestamp
const rightTzWrongUnix = dateFnsTz.toDate(wrongTz, { timeZone, locale });
// Actual correct UTC string datestamp in our target TZ
const stampWithTz = dateFnsTz.format(rightTzWrongUnix, 'yyyy-MM-dd HH:mm:ss XX', { locale, timeZone });
// Parse the UTC stamp
const finalDate = new Date(stampWithTz)
// This is correct!
console.log(getUnixTime(finalDate))
// >> 1695700800, Tuesday, September 26, 2023 4:00:00 GMT+0

这个想法是,我们可以让 date-fns-tz 输出一个字符串戳,该戳以正确的 UTC 时间格式化,具有适当的时区偏移量,有/没有夏令时。底层日期对象格式正确,但在内部保存错误的 Unix 时间戳,因为这就是 date-fns-tz 的工作方式。rightTzWrongUnix

我们可以获取生成的正确 UTC 时间戳,用 读回,现在将保存真正的 Unix utc 时间戳。new Date()

JavaScript 时间 日期 fns 日期 fns-tz

评论

1赞 RobG 9/29/2023
你试过zonedTimeToUtc吗?例如?您将需要 date-fns-tz。顺便说一句,date-fns 文档中的陈述“一个普通的 JS Date,它隐含了当前系统的时区”具有误导性。ECMAScript 日期是 UTC,只有非 UTC 方法(包括 toString)返回“本地”值,UTC 方法都返回 UTC 值,而 Date 核心的时间值是 UTC。const utcDate = zonedTimeToUtc('2018-09-01 18:01:36.386', 'Europe/Berlin')
0赞 douliman 9/30/2023
@RobG 这更理智!我错误地将该函数误解为仅 utcToZonedTime() 的纯逆函数。utcToZonedTime() 将正确格式化字符串,但从根本上改变了 Unix 时间戳。应用 zonedTimeToUtc() 可以撤消它,并获得正确的 unix 时间。不过这行得通!如果你想发布一个答案,我会把它标记为正确。

答: 暂无答案