提问人:douliman 提问时间:9/27/2023 最后编辑:douliman 更新时间:9/27/2023 访问量:51
date-fns-tz 解析日期戳,就好像它在特定时区一样
date-fns-tz parse a datestamp as if it was in a specific timezone
问:
我经常想要在特定时区中提取与时区无关的日期戳的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()
答: 暂无答案
评论
const utcDate = zonedTimeToUtc('2018-09-01 18:01:36.386', 'Europe/Berlin')