管理中心
我的
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录

时区

使用场景

全球各国家和地区的经度不同,地方时间也有所不同,因此划分了不同的时区。例如,英国采用0时区,中国采用东8时区,中国时间要比英国快8小时,中国北京中午12:00,对应英国伦敦是凌晨4:00。时区模块可用于获取时区列表,应用可基于该列表实现业务逻辑,如双时钟应用。

从API version 20开始,时区模块还可用于获取时区跳变时间点和偏移量等,时区的跳变逻辑参考夏令时跳变。

接口说明

时区模块关键接口如下表所示,具体API说明详见国际化-I18n。

展开
接口名 描述
getTimeZone(zoneID?: string): TimeZone 获取时区ID对应的时区对象。
getID(): string 获取时区对象的ID。
getDisplayName(locale?: string, isDST?: boolean): string 获取时区对象名称在指定语言下的翻译。
getRawOffset(): number 获取时区的固定偏移量。
getOffset(date?: number): number 获取某一时刻时区对象所表示时区的偏移量。
getAvailableIDs(): Array<string> 获取系统支持的时区ID列表。
getAvailableZoneCityIDs(): Array<string> 获取系统支持的时区城市ID列表。
getCityDisplayName(cityID: string, locale: string): string 获取时区城市名称在指定语言下的翻译。
getTimezoneFromCity(cityID: string): TimeZone 根据城市ID创建对应的时区对象。
getTimezonesByLocation(longitude: number, latitude: number): Array<TimeZone> 根据地理坐标获取所在时区对象的数组。
getZoneRules(): ZoneRules 获取时区跳变规则。
nextTransition(date?: number): ZoneOffsetTransition 获取指定时间的下一个时区跳变对象。
getMilliseconds(): number 获取时区跳变点的时间戳。
getOffsetAfter(): number 获取时区跳变后的偏移量。
getOffsetBefore(): number 获取时区跳变前的偏移量。

开发步骤

时区接口基本功能

  1. 导入模块。

    收起
    自动换行
    深色代码主题
    复制
    1. import { i18n } from '@kit.LocalizationKit';
  2. 使用场景。

  • 时区接口基本功能:包括获取特定时区、计算固定和实际时区偏移量、遍历时区列表。

    收起
    自动换行
    深色代码主题
    复制
    1. // 获取巴西时区
    2. let timezone: i18n.TimeZone = i18n.getTimeZone('America/Sao_Paulo'); // 传入特定时区,创建时区对象
    3. let timezoneId = timezone.getID(); // timezoneId = 'America/Sao_Paulo'
    4. // 获取城市ID对应的时区对象
    5. let aucklandTimezone: i18n.TimeZone = i18n.TimeZone.getTimezoneFromCity('Auckland');
    6. timezoneId = aucklandTimezone.getID(); // timezoneId = 'Pacific/Auckland'
    7. // 获取时区的本地化名称
    8. let timeZoneName = timezone.getDisplayName('zh-Hans', true); // timeZoneName = '巴西利亚标准时间'
    9. // 本地化城市名称
    10. let cityDisplayName = i18n.TimeZone.getCityDisplayName('Auckland', 'zh-Hans'); // cityDisplayName = '奥克兰 (新西兰)'
    11. // 时区的固定偏移量
    12. let rawOffset = timezone.getRawOffset(); // rawOffset = -10800000
    13. // 时区的实际偏移量(固定偏移量+夏令时)
    14. let offset = timezone.getOffset(1234567890); // offset = -10800000
    15. // 系统支持的时区ID列表
    16. let availableIDs = i18n.TimeZone.getAvailableIDs(); // availableIDs = ['America/Adak', 'Asia/Hovd', ...]
    17. // 系统支持的时区城市ID列表
    18. let cityIDs = i18n.TimeZone.getAvailableZoneCityIDs(); // cityIDs = ['Auckland', 'Magadan', ...]
    19. // 指定地理坐标所在的时区对象数组
    20. let timezoneArray: i18n.TimeZone[] = i18n.TimeZone.getTimezonesByLocation(-43.1, -22.5);
    21. // 获取指定时间的下一个时区跳变点
    22. let tijuanaTzId = 'America/Tijuana';
    23. let tijuanaTimeZone: i18n.TimeZone = i18n.getTimeZone(tijuanaTzId); // 获取蒂华纳时区对象
    24. let zoneRules: i18n.ZoneRules = tijuanaTimeZone.getZoneRules(); // 获取蒂华纳时区的时区跳变规则
    25. let someTime = new Date(2025, 4, 13);
    26. let zoneOffsetTrans: i18n.ZoneOffsetTransition = zoneRules.nextTransition(someTime.getTime());
    27. zoneOffsetTrans.getMilliseconds(); // 跳变点的时间戳: 1762074000000
    28. zoneOffsetTrans.getOffsetAfter(); // 跳变后的偏移量: -28800000
    29. zoneOffsetTrans.getOffsetBefore(); // 跳变前的偏移量: -25200000
    30. // 将跳变点时间格式化
    31. let dateTimeFormat: Intl.DateTimeFormat = new Intl.DateTimeFormat('en-US', {
    32. timeZone: tijuanaTzId,
    33. dateStyle: 'long',
    34. timeStyle: 'long',
    35. hour12: false
    36. });
    37. let dateFormat =
    38. dateTimeFormat.format(new Date(zoneOffsetTrans.getMilliseconds())); // November 2, 2025, 1:00:00 PST
  • 双时钟应用:首先选择时区列表中的时区,添加到应用偏好时区列表。然后遍历应用偏好时区列表,获取各时区的时间。

    收起
    自动换行
    深色代码主题
    复制
    1. let pauloTimezone: i18n.TimeZone = i18n.getTimeZone('America/Sao_Paulo');
    2. let defaultTimezone: i18n.TimeZone = i18n.getTimeZone();
    3. let appPreferredTimeZoneList: i18n.TimeZone[] = []; // 应用偏好时区列表
    4. appPreferredTimeZoneList.push(pauloTimezone);
    5. appPreferredTimeZoneList.push(defaultTimezone);
    6. let locale: Intl.Locale = i18n.System.getSystemLocaleInstance();
    7. for (let i = 0; i < appPreferredTimeZoneList.length; i++) {
    8. let timezone = appPreferredTimeZoneList[i].getID();
    9. let calendar: i18n.Calendar = i18n.getCalendar(locale.toString());
    10. calendar.setTimeZone(timezone); // 设置日历对象的时区
    11. // 获取年月日时分秒
    12. let year = calendar.get('year');
    13. let month = calendar.get('month');
    14. let day = calendar.get('date');
    15. let hour = calendar.get('hour');
    16. let minute = calendar.get('minute');
    17. let second = calendar.get('second');
    18. }