我正在使用react / redux开发一个应用程序,我开始使用库react-intl来格式化消息和日期。
我已经能够在<FormattedDate>
标记中显示它正在使用的时区。
我希望选择所有可能存在的时区,因此当用户选择一个时区时,<FormattedDate>
会自动更改为该格式。
我没有找到如何用react-intl列出所有可行的时区。
我也在谷歌搜索过,我没有找到任何内置的javascript函数。
是这样吗?我怎样才能获得该清单?
由于
注意:不要认为它是同一个问题,因为我不想使用外部库,如果可能的话,如果它是唯一的解决方案,那么我将不得不这样处理......:/
答案 0 :(得分:3)
我也需要一个完整的时区列表,其中包含以下格式的数据:
{
name: "America/Los_Angeles",
alternativeName: "Pacific Time",
group: ["America/Los_Angeles"],
countryName: "United States",
mainCities: ["Los Angeles", "San Diego"],
rawOffsetInMinutes: -480, // "raw" time zone offset, when there's no DST in place
rawFormat: "-08:00 Pacific Time - Los Angeles, San Diego",
currentTimeOffsetInMinutes: -420, // "current" time zone offset, this is why getTimeZones() is a method and not just an object: it can only work at runtime
currentTimeFormat: "-07:00 Pacific Time - Los Angeles, San Diego",
}
由于找不到合适的清单,因此我为其创建了一个npm软件包:https://github.com/vvo/tzdb/。更改时(例如新时区),时区列表会自动更新。
如果您需要操纵带时区的日期,则可以使用https://github.com/moment/luxon。
时区列表被分组以减少时区数量。我们仅在以下情况下进行分组:相同的国家/地区和相同的偏移量(DST,非DST)。
这基本上为您提供了一个与Google日历中的时区非常接近的时区列表。
祝你好运!
答案 1 :(得分:2)
react-intl库的时区功能仅由集成到浏览器中的ECMAScript Internationalization API功能提供。
虽然IANA时区支持是此规范的一部分,但它目前仅涵盖两种情况:
将Date
对象格式化为字符串,转换为流程中的特定时区。
确定用户的本地时区标识符。
不幸的是,规范没有定义枚举可用时区列表的功能。
此外,请注意,对它所具有的两个功能的支持目前仅限于少数浏览器。可能需要一段时间才能依赖这些功能。 ECMAScript Compatibility Table显示支持哪些浏览器。在DateTimeFormat
下,您会找到&#34; resolvedOptions()。timeZone默认为主机环境&#34; 和&#34;接受IANA时区名称&#34 ; 跟踪这些功能。
答案 2 :(得分:2)
JAVA 11中的截止日期
compare_ssim(grayA, grayB, multichannel = True)
我发现600个已排序的TimeZone
ZoneRulesProvider.java
答案 3 :(得分:1)
我最近创建了一个包含所有时区的数组,发现Chromium 71.0.3578.98中缺少几个official timezones。
您可以在我报告的comment的bug中看到该数组。为了方便起见,我将以下数组包括在内:
{'DiskStatus': [OrderedDict([('Mount', '/'), ('Total', '9.8G'), ('available', '6.8G'), ('used', '27%')]), OrderedDict([('Mount', '/home'), ('Total', '4.8G'), ('available', '3.6G'), ('used', '22%')]), OrderedDict([('Mount', '/opt'), ('Total', '9.8G'), ('available', '5.2G'), ('used', '44%')]), OrderedDict([('Mount', '/tmp'), ('Total', '3.9G'), ('available', '3.6G'), ('used', '2%')])]}
如果您像我一样,想知道为什么会有那么多时区,请查看此question。
答案 4 :(得分:0)
对于未来的搜索者,可以使用moment-timezone获取所有时区的列表。
import momentTZ from 'moment-timezone';
const defaultTimeZone = momentTZ.tz.guess();
const timeZonesList = momentTZ.tz.names();
答案 5 :(得分:0)
我知道我的答案来晚了,但是如果您使用的是Intl并且关注时区,并且您正在面对网络,那么几乎可以肯定需要https://github.com/yahoo/date-time-format-timezone。由于无论如何您都将在项目中使用它,因此即使您不使用polyfill,也可以从polyfill内部检索时区数据。
每个人都在使用IANA数据库,因此您应该获得一致的结果。
答案 6 :(得分:0)
标记的答案似乎不适用于 Pacific/Honolulu
时区。
我制作了另一个适用于此的函数:
function getTimezoneOffset(timeZone) {
const now = new Date();
const tzString = now.toLocaleString('en-US', { timeZone });
const localString = now.toLocaleString('en-US');
const diff = (Date.parse(localString) - Date.parse(tzString)) / 3600000;
const offset = diff + now.getTimezoneOffset() / 60;
return -offset;
}
用法示例:
const offset = getTimezoneOffset('Pacific/Honolulu');
console.log(offset); // output: -10