如何使用 date-fns-tz 检测时区缩写?

Posted

技术标签:

【中文标题】如何使用 date-fns-tz 检测时区缩写?【英文标题】:How to detect timezone abbreviation using date-fns-tz? 【发布时间】:2021-04-01 14:35:37 【问题描述】:

我想打印timeZone abbreviation,例如:IST、UTC、PST、MST、CST、EST 等...

我正在将我的代码从 momentJS 迁移到 date-fns 并遇到以下问题。当我使用 momentJS 时,一切都按预期工作。例如,下面的代码将打印“IST

const timeZone = 'Asia/Calcutta';
moment.tz(new Date(), timeZone).format('z'); // IST

Demo using MomentJS

现在我使用 date-fns 的代码可以工作,但不是一直有效,因为它会打印 "India Standard Time" 而我只想打印 IST强>。

format(parisDate, 'zzzz',  timeZone: 'Asia/Calcutta', locale: enGB ); // India Standard Time

谁能告诉我我错过了什么或做错了什么? 这是我的代码的现场演示:date-fns DEMO

【问题讨论】:

有趣的问题。我找到了解决方案,但无法解释原因...您应该导入不同的语言环境(默认为 en-US)。导入import enGB from 'date-fns/locale/en-GB',然后在您的示例中更改为const zoneString = format(utcToZonedTime(new Date(), timeZone), 'zzz', locale: enGB); 即可完成这项工作。但是,我无法理解为什么时区缩写与图书馆的语言环境相关联。我会阅读文档,也许会上传一个正确的答案。 @antoniom 我导入了您的建议并进行了更改,但它会打印“GMT+5:30”。它不起作用 奇怪...适合我...看看这里github.com/marnusw/date-fns-tz#format @antoniom 你是在打印“印度标准时间”还是 IST”?我想打印“IST” 请使用“en-IN”作为区域设置再次重试。并将date-fns升级到最新版本(2.16.1) 【参考方案1】:

在检查date-fns-tz 的代码后,发现它不会自己生成时区缩写,而是使用浏览器的 Intl API。时区缩写因地区而异。 诸如“en-US”或“en-GB”之类的语言环境不包含 IST 作为时区缩写,而“en-IN”包含。 因此,您需要

import enIN from 'date-fns/locale/en-IN'

然后将其作为第三个参数传递给您的format 调用 即

import  utcToZonedTime, format  from "date-fns-tz";
const timeZone = "Asia/Kolkata"
const zoneString = format(utcToZonedTime(new Date(), timeZone), "zzz", 
  timeZone,
  locale: enIN
);

但这并不能保证其他缩写(例如 CET)也适用于建议的语言环境

【讨论】:

您当前的解决方案仅适用于印度。因为如果 timeZone = 'Europe/Paris' 则 zoneString 的值为 GMT+1 而不是打印“CEST”。希望这是有道理的。 我想知道是否有一种方法可以一次从 date-fns/locale 导入所有内容,例如 date-fns/locale/* ? 恐怕达不到想要的效果。似乎不同的语言环境会返回不同的缩写时区。例如,我所在国家/地区的语言环境('el' / 希腊)可以很好地应对每个欧洲时区(CEST、EET 等),但不适用于 IST 或 EST。 momentJS 能够完成这项任务,但由于某种原因,使用 date-fns 似乎很棘手 如果我错了,请纠正我,但moment-timezone 似乎正在使用查找表来报告“IST”。这是一种完全不同的技术

以上是关于如何使用 date-fns-tz 检测时区缩写?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中获取移动时区的缩写/国家代码?

将时区缩写解析为 UTC [重复]

如何在 ICU4J 中获得“当前”IANA 时区缩写?

获取当前时区缩写 Android

iOS Swift:当字符串包含时区缩写时,如何将特定的日期字符串格式转换为日期对象?

在 Python 中使用时区缩写名称解析日期/时间字符串?