tzdb
这是一个列表和 npm 包,包含:
- "简化"的 IANA 时区,使用如
Pacific Time
而非America/Los_Angeles
的替代名称,以及每个时区的主要城市。 - 所有现有的原始 IANA 时区名称
- "原始"偏移量以及当前时间偏移量
- 还包括已弃用的时区名称以保持兼容性
数据和 npm 包会在 https://www.geonames.org/ 发生变化时自动更新,该网站是根据 IANA 数据库生成的。
这在构建应用程序的时区选择菜单时非常有用。
NPM 包
安装:
npm add @vvo/tzdb
使用:
import { getTimeZones, rawTimeZones, timeZonesNames, abbreviations } from "@vvo/tzdb";
API
getTimeZones()
const timeZones = getTimeZones();
// 你也可以提供一个可选参数来在结果中包含 UTC。
// 这会添加一个名为 "UTC" 且固定偏移量为 0 的时区。
const timeZonesWithUtc = getTimeZones({ includeUtc: true });
此方法返回一个时区对象数组:
[
// ...
{
name: "America/Los_Angeles",
alternativeName: "Pacific Time",
group: ["America/Los_Angeles"],
continentCode: "NA",
continentName: "North America",
countryName: "United States",
countryCode: "US",
mainCities: ["Los Angeles", "San Diego", "San Jose", "San Francisco"],
rawOffsetInMinutes: -480,
abbreviation: "PST",
rawFormat: "-08:00 Pacific Time - Los Angeles, San Diego, San Jose, San Francisco",
currentTimeOffsetInMinutes: -420, // "当前"时区偏移量,这就是为什么 getTimeZones() 是一个方法而不仅仅是一个对象:它在运行时工作
currentTimeFormat: "-07:00 Pacific Time - Los Angeles, San Diego",
},
// ...
];
在适当的情况下,时区会被分组。分组规则如下:
- 如果时区在同一国家
- 如果夏令时或夏季时间偏移量相同
- 如果非夏令时、非夏季时间偏移量相同
- 那么我们就将这些时区分组
- "主要"时区名称(
name
属性)始终是人口最多的城市的时区
以下是一个分组示例:
{
name: "America/Dawson_Creek",
alternativeName: "Mountain Time",
group: ["America/Creston", "America/Dawson_Creek", "America/Fort_Nelson"],
continentCode: "NA",
continentName: "North America",
countryName: "Canada",
countryCode: "CA",
mainCities: ["Fort St. John", "Creston", "Fort Nelson"],
rawOffsetInMinutes: -420,
abbreviation: "MST",
rawFormat: "-07:00 Mountain Time - Fort St. John, Creston, Fort Nelson",
currentTimeOffsetInMinutes: -420,
currentTimeFormat: "-07:00 Mountain Time - Fort St. John, Creston"
}
rawTimeZones
这是一个不包含当前时间信息的时区对象数组:
[
// ...
{
name: "America/Los_Angeles",
alternativeName: "Pacific Time",
group: ["America/Los_Angeles"],
continentCode: "NA",
continentName: "North America",
countryName: "United States",
countryCode: "US",
mainCities: ["Los Angeles", "San Diego", "San Jose", "San Francisco"],
rawOffsetInMinutes: -480,
abbreviation: "PST",
rawFormat: "-08:00 Pacific Time - Los Angeles, San Diego, San Jose, San Francisco",
},
// ...
];
timeZonesNames
这是一个时区名称数组:
[
// ...
"America/Juneau",
"America/Kentucky/Louisville",
"America/Kentucky/Monticello",
"America/Kralendijk",
"America/La_Paz",
"America/Lima",
"America/Los_Angeles",
"America/Lower_Princes",
"America/Maceio",
"America/Managua",
"America/Manaus",
"America/Marigot",
"America/Martinique",
"America/Matamoros",
// ...
];
abbreviations
这是一个将时区缩写映射到其全称的对象:
{
// ...
"Australian Central Daylight Time": "ACDT",
"Australian Central Standard Time": "ACST",
"Australian Central Time": "ACT",
"Australian Central Western Standard Time": "ACWST",
"Australian Eastern Daylight Time": "AEDT",
"Australian Eastern Standard Time": "AEST",
"Australian Eastern Time": "AET",
"Australian Western Daylight Time": "AWDT",
"Australian Western Standard Time": "AWST",
"Azerbaijan Summer Time": "AZST",
"Azerbaijan Time": "AZT",
"Azores Summer Time": "AZOST",
"Azores Time": "AZOT",
"Bangladesh Standard Time": "BST",
"Bhutan Time": "BTT",
"Bolivia Time": "BOT",
// ...
};
注意: 虽然缩写查找起来很方便,但它们可能会产生误导。例如:CST 可以指中央标准时间(UTC -06:00)、中国标准时间(UTC +06:00)或古巴标准时间(UTC -05:00)。而且缩写的全称并不直接映射到 rawTimeZones
或 getTimeZones()
返回的时区对象中的任何属性。
注意事项
- 当发生分组时,我们会提供两个城市,按人口排序
- 我们提供替代名称("America/Los_Angeles" 的 "Pacific Time"),并从中删除 "Standard"、"Daylight" 或 "Summer"
- 如果你使用这个来构建时区选择器并保存到数据库,那么:
- 确保在数据库中保存
name
属性(America/Los_Angeles
) - 当显示带有数据库默认值的选择器时,选择匹配的时区名称,或者如果时区名称是组的一部分。例如:
- 确保在数据库中保存
const value = timeZones.find((timeZone) => {
return dbData.timeZone === timeZone.name || timeZone.group.includes(dbData.timeZone);
});