如何在javascript中获取所有时区的列表

时间:2016-07-15 15:06:45

标签: javascript timezone react-intl

我正在使用react / redux开发一个应用程序,我开始使用库react-intl来格式化消息和日期。

我已经能够在<FormattedDate>标记中显示它正在使用的时区。

我希望选择所有可能存在的时区,因此当用户选择一个时区时,<FormattedDate>会自动更改为该格式。

我没有找到如何用react-intl列出所有可行的时区。

我也在谷歌搜索过,我没有找到任何内置的javascript函数。

是这样吗?我怎样才能获得该清单?

由于

注意:不要认为它是同一个问题,因为我不想使用外部库,如果可能的话,如果它是唯一的解决方案,那么我将不得不这样处理......:/

7 个答案:

答案 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

您可以在我报告的commentbug中看到该数组。为了方便起见,我将以下数组包括在内:

{'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