1# 时区
2
3## 使用场景
4
5全球各国家和地区的经度不同,地方时间也有所不同,因此划分了不同的时区。例如英国采用0时区,中国采用东8时区,中国时间要比英国快8个小时,中国北京中午12:00是英国伦敦凌晨4点。时区模块主要用于获取时区列表,同时,应用可基于获取的时区列表实现自身业务逻辑,如双时钟应用。
6
7## 开发步骤
8
9### 时区相关功能
10
111. 导入模块。
12   ```ts
13   import { i18n } from '@kit.LocalizationKit';
14   ```
15
162. 开发实例,包括获取特定时区、计算固定和实际时区偏移量、获取和遍历时区列表等。
17   ```ts
18   // 获取巴西时区
19   let timezone = i18n.getTimeZone("America/Sao_Paulo"); // 传入特定时区,创建时区类
20   let timezoneId = timezone.getID();// America/Sao_Paulo
21
22   // 获取城市Id对应的时区对象
23   let aucklandTimezone = i18n.TimeZone.getTimezoneFromCity("Auckland");
24   let aucklandTzId = aucklandTimezone.getID(); // Pacific/Auckland
25
26   // 时区的本地化名称
27   let timeZoneName = timezone.getDisplayName("zh-Hans", true); // 巴西利亚标准时间
28
29   // 本地化城市名称
30   let cityDisplayName = i18n.TimeZone.getCityDisplayName("Auckland", "zh-Hans") // 奥克兰 (新西兰)
31
32   // 时区的固定偏移量
33   let rawOffset = timezone.getRawOffset(); // -10800000
34
35   // 时区的实际偏移量(固定偏移量+夏令时)
36   let offset = timezone.getOffset(1234567890);// -10800000
37
38   // 系统支持的时区Id列表
39   let ids = i18n.TimeZone.getAvailableIDs(); // ["America/Adak", "Asia/Hovd", "America/Sao_Paulo", "Asia/Jerusalem", "Europe/London",...]
40
41   // 系统支持的时区城市Id列表
42   let cityIdArray = i18n.TimeZone.getAvailableZoneCityIDs();  // ["Auckland", "Magadan", "Lord Howe Island",...]
43   // 遍历时区城市Id列表
44   let timezoneList: Array<object> = [];  // 呈现给用户的时区列表
45   class Item {
46       cityDisplayName : string = "";
47       timezoneId : string = "";
48       offset : string = "";
49       cityId : string = ""
50   }
51   for (let i =0 ; i < cityIdArray.length ; i++) {
52       let cityId = cityIdArray[i];
53       let timezone = i18n.TimeZone.getTimezoneFromCity(cityId); // 城市Id对应的时区对象
54       let cityDisplayName = i18n.TimeZone.getCityDisplayName(cityId, "zh-CN"); // 本地化城市名称
55       let timestamp = (new Date()).getTime()
56       let item : Item = {
57           cityDisplayName : cityDisplayName,
58           timezoneId : timezone.getID(),
59           offset : 'GMT'+ (timezone.getOffset(timestamp) / 3600*1000),
60           cityId : cityId
61       }
62       timezoneList.push(item);
63    }
64
65   // 指定地理坐标所在的时区对象数组
66   let timezoneArray = i18n.TimeZone.getTimezonesByLocation(-43.1, -22.5)
67   for (let i =0;i < timezoneArray.length; i++) {
68       let tzId = timezoneArray[i].getID(); // America/Sao_Paulo
69   }
70   ```
71
72### 双时钟应用
73
741. 导入模块。
75   ```ts
76   import { i18n } from '@kit.LocalizationKit';
77   ```
78
792. 选择时区列表中的时区放入应用偏好时区列表中。
80   ```ts
81   let timezone1 = i18n.getTimeZone("America/Sao_Paulo");
82   let timezone2 = i18n.getTimeZone();
83   let appPreferredTimeZoneList: Array<i18n.TimeZone> = [] // 应用偏好时区列表
84   appPreferredTimeZoneList.push(timezone1);
85   appPreferredTimeZoneList.push(timezone2);
86   ```
87
883. 遍历应用偏好时区列表,获取各时区时间。
89   ```ts
90   let locale = i18n.System.getSystemLocale();
91   for (let i = 0 ; i < appPreferredTimeZoneList.length ; i++) {
92       let timezone = appPreferredTimeZoneList[i].getID();
93       let calendar = i18n.getCalendar(locale);
94       calendar.setTimeZone(timezone); //设置日历对象的时区
95       //获取年月日时分秒
96       let year = calendar.get("year");
97       let month = calendar.get("month");
98       let day = calendar.get("date");
99       let hour = calendar.get("hour");
100       let minute = calendar.get("minute");
101       let second = calendar.get("second");
102   }
103   ```