Java 查找具有非整数小时偏移量的时区,用户希望查找所有具有非整数小时偏移量(non-integral hour offset)的时区,获取每个时区的时区偏移量,并计算总秒数除以 3600 之后的剩余时间。
Java 查找具有非整数小时偏移量的时区 问题描述
用户希望查找所有具有非整数小时偏移量(non-integral hour offset)的时区。
Java 查找具有非整数小时偏移量的时区 解决方案
获取每个时区的时区偏移量,并计算总秒数除以 3600 之后的剩余时间。
Java 查找具有非整数小时偏移量的时区 具体实例
大部分时区的 UTC 偏移量为小时的整数。例如,通常所说的北美东部时区(EST)为 UTC-05:00
,而欧洲中部时间(CET)为 UTC+01:00
。不过也存在 UTC 偏移量为半小时甚至 45 分钟的时区,如印度标准时间(IST)为 UTC+05:30
,而查塔姆标准时间(CHAST)为 UTC+12:45
。本范例将讨论利用 java.time
包查找所有具有非整数小时偏移量的时区。
如例 8-33 所示,我们通过 ZoneOffset
类查找每个时区 ID 相对于 UTC 的偏移量,并将其总秒数与 3600 秒(1 小时)进行比较。
例 8-33 查找每个时区 ID 的偏移量(以秒为单位)
❶ 将地区 ID(字符串)映射到时区 ID
❷ 计算偏移量
❸ 仅返回偏移量无法被 3600 整除的时区 ID
ZoneId.getAvailableZoneIds
静态方法返回 Set<String>
,表示所有可用的时区 ID;ZoneId.of
方法将生成的字符串流转换为 ZoneId 实例流。
在本例中,筛选器中的 lambda 表达式首先将 atZone
方法应用到 Instant
以创建 ZonedDateTime
,然后应用 getOffset
方法。最后,利用 ZoneOffset
类定义的 getTotalSeconds
方法获取时区偏移量(以秒为单位)。根据 Javadoc 的描述,getTotalSeconds
方法是“访问偏移量的主要方式,它返回小时、分、秒字段的总和(以秒为单位),作为一个偏移量添加到给定的时间”。仅当总秒数无法被 3600(60 sec/min * 60 min/hour
)整除时,筛选器中的 Predicate
才返回 true
。
在打印结果前,程序对生成的 ZoneId
实例排序。sorted
方法传入 Comparator
作为参数。本例使用 Comparator
接口定义的静态方法 comparingInt
,它生成一个根据给定整数键排序的 Comparator
。程序同样采用 getTotalSeconds
方法获取时区偏移量(以秒为单位),ZoneId
实例根据偏移量进行排序。
接下来,针对每个 ZoneId
,程序使用 withZoneSameInstant
方法计算默认时区中当前的 ZonedDateTime
,以打印结果。打印的字符串将显示偏移量、时区 ID 以及相应时区中经过格式化的本地时间。
程序的执行结果如例 8-34 所示。
例 8-34 具有非整数小时偏移量的时区
可以看到,将 java.time
包中的多个类结合在一起使用,就能解决复杂而有趣的问题。