Skip to content

时区

导航目录

什么是时区

  • 时区是指地球上的某个区域使用相同标准时间的范围。由于地球自转的关系,不同地区的日出和日落时间不同,因此人们将地球划分为不同的时区,每个时区都基于当地的太阳时间来确定时间。

时区分布

  • 全球一共有大约 37 种时区。虽然理论上地球被划分为 24 个标准时区(每个时区相差 1 小时),但由于某些国家和地区采用了半小时或 15 分钟的偏移时间,再加上一些极端的时区(如 UTC+14 和 UTC-12),使得实际的时区数量要多于 24 个。

UTC-12 到 UTC-1

  • UTC-12:贝克岛、豪兰岛
  • UTC-11:美属萨摩亚、纽埃岛
  • UTC-10:夏威夷-阿留申标准时间(包括夏威夷、塔希提岛)
  • UTC-9:30:法属波利尼西亚(马贵斯群岛)
  • UTC-9:阿拉斯加标准时间(包括美属萨摩亚、法属波利尼西亚的甘比尔群岛)
  • UTC-8:太平洋标准时间(美国西海岸、加拿大西部)
  • UTC-7:山地标准时间(美国中部、墨西哥部分地区)
  • UTC-6:中部标准时间(美国、墨西哥、洪都拉斯)
  • UTC-5:东部标准时间(美国东部、加拿大东部、哥伦比亚、秘鲁)
  • UTC-4:大西洋标准时间(加勒比地区、委内瑞拉、玻利维亚)
  • UTC-3:30:纽芬兰标准时间(加拿大纽芬兰和拉布拉多)
  • UTC-3:阿根廷、乌拉圭、巴西部分地区
  • UTC-2:南乔治亚岛、南桑威奇群岛
  • UTC-1:亚速尔群岛、佛得角

UTC+0 到 UTC+14

  • UTC+0(GMT):英国、葡萄牙、冰岛
  • UTC+1:中欧时间(法国、德国、意大利、西班牙)、西非时间
  • UTC+2:东欧时间(芬兰、希腊、以色列、南非)、中东时间(例如,约旦)
  • UTC+3:莫斯科时间、沙特阿拉伯、东非时间(肯尼亚、埃塞俄比亚)
  • UTC+3:30:伊朗标准时间
  • UTC+4:阿联酋、阿塞拜疆、毛里求斯
  • UTC+4:30:阿富汗标准时间
  • UTC+5:巴基斯坦、土库曼斯坦、乌兹别克斯坦
  • UTC+5:30:印度标准时间、斯里兰卡
  • UTC+5:45:尼泊尔标准时间
  • UTC+6:孟加拉国、哈萨克斯坦、吉尔吉斯斯坦
  • UTC+6:30:缅甸、科科斯群岛
  • UTC+7:泰国、越南、印度尼西亚部分地区
  • UTC+8:中国标准时间、马来西亚、新加坡、澳大利亚西部时间
  • UTC+8:45:澳大利亚尤克拉标准时间
  • UTC+9:日本标准时间、韩国标准时间
  • UTC+9:30:澳大利亚中部标准时间
  • UTC+10:澳大利亚东部标准时间、巴布亚新几内亚
  • UTC+10:30:澳大利亚部分地区(如劳雷尔群岛)
  • UTC+11:所罗门群岛、新喀里多尼亚
  • UTC+12:斐济、基里巴斯
  • UTC+12:45:新西兰查塔姆群岛
  • UTC+13:汤加、萨摩亚
  • UTC+14:基里巴斯部分岛屿

什么是零时区

  • 零时区(也称为 UTC 0GMT 0)是指协调世界时(UTC)的基准时区。它位于格林尼治天文台的经度 0 度线,即格林尼治标准时间(GMT)的起点。

零时区的用途

  • 零时区作为全球时间系统的基准,所有其他时区的时间都是相对于这个基准来计算的。它帮助协调世界各地的时间,使得国际活动可以在一致的时间框架下进行。

JavaScript 日期时区

功能说明:JavaScript 中的日期对象会根据本地时区生成时间,但也提供了方法来处理不同时区的时间。

  • 在 JavaScript 中,使用 new Date() 创建的日期对象会根据你所在的本地时区生成当前日期和时间。默认情况下,Date 对象会使用操作系统的时区设置。
js
const date = new Date();
// 浏览器或 JavaScript 环境会自动转成本地的时区
console.log(date.toString()); // 输出本地时区的时间字符串,例如:"Sat Sep 14 2024 10:16:12 GMT+0800 (中国标准时间)"

// 假设你所在时区为 UTC+8(中国标准时间),转换成 UTC 零时,需要减去8个小时的时差,所以 10:16:12 => 02:16:12
console.log(date.toISOString()); // 输出 UTC 时间的字符串,例如:"2024-09-14T02:16:12.232Z"

// 假设你所在时区为 UTC-2(南乔治亚岛),转换成 UTC 零时,需要加2个小时的时差,所以 10:16:12 => 12:16:12
console.log(date.toISOString()); // 输出 UTC 时间的字符串,例如:"2024-09-14T12:16:12.232Z"

时区转换示例

功能说明:展示如何在 JavaScript 中进行时区转换和处理。

js
// 1. 创建一个指定时区的日期对象
const date = new Date("2024-09-14T10:16:12+08:00"); // 中国标准时间

// 2. 转换为 UTC 时间
const utcTime = date.toISOString();
console.log("UTC 时间:", utcTime); // 输出: 2024-09-14T02:16:12.000Z

// 3. 获取本地时间的各个部分
const year = date.getFullYear();
const month = date.getMonth() + 1; // 月份从 0 开始
const day = date.getDate();
const hours = date.getHours();
const minutes = date.getMinutes();
const seconds = date.getSeconds();

console.log(`${year}-${month}-${day} ${hours}:${minutes}:${seconds}`); // 本地时间

// 4. 获取 UTC 时间的各个部分
const utcYear = date.getUTCFullYear();
const utcMonth = date.getUTCMonth() + 1;
const utcDay = date.getUTCDate();
const utcHours = date.getUTCHours();
const utcMinutes = date.getUTCMinutes();
const utcSeconds = date.getUTCSeconds();

console.log(
  `UTC: ${utcYear}-${utcMonth}-${utcDay} ${utcHours}:${utcMinutes}:${utcSeconds}`
); // UTC 时间

处理时区的最佳实践

  1. 存储时间时使用 UTC:在数据库中存储时间时,建议使用 UTC 时间,避免时区混淆
  2. 显示时间时转换为本地时区:在前端显示时间时,根据用户的本地时区进行转换
  3. 使用专门的库:对于复杂的时区处理,建议使用 Moment.js 或 date-fns-tz 等库
  4. 注意夏令时:某些地区会实行夏令时,需要考虑这一因素

时区常见问题

1. 为什么会有半小时和 15 分钟的时区?

  • 一些国家和地区为了更好地适应当地的地理情况,采用了非整小时的时区偏移。例如,印度使用 UTC+5:30,尼泊尔使用 UTC+5:45。

2. 什么是夏令时?

  • 夏令时(Daylight Saving Time,DST)是指在夏季将时钟调快一小时,以充分利用日照时间,减少人工照明的使用。并非所有国家都实行夏令时。

3. 如何在 JavaScript 中检测夏令时?

js
function isDaylightSavingTime(date) {
  const jan = new Date(date.getFullYear(), 0, 1);
  const jul = new Date(date.getFullYear(), 6, 1);
  return (
    date.getTimezoneOffset() <
    Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset())
  );
}

const now = new Date();
console.log("是否处于夏令时:", isDaylightSavingTime(now));