如何为指定地点确定正确的时区ID(ZoneId)?
如何确定指定地点的时区ID(ZoneId)——以美国北卡罗来纳州为例
北卡罗来纳州属于美国东部时区,但“东部时区”并不是Java中有效的ZoneId;EDT(东部夏令时)、EST(东部标准时间)只是时区偏移的别名,也无法直接作为ZoneId使用。你通过筛选偏移为-5的时区得到了一堆候选,以下是判断和选择的方法:
1. 优先选标准的「大洲/主要城市」格式ZoneId
美国东部时区的标准代表ZoneId是America/New_York,北卡罗来纳州的夏令时、标准时切换规则和纽约完全一致,用这个ID完全没问题,它会自动处理EDT和EST的切换逻辑,无需手动干预。
2. 验证候选ZoneId的正确性
可以用代码验证该ZoneId的规则是否匹配北卡的实际时区情况:
import java.time.* fun main() { val targetZone = ZoneId.of("America/New_York") val now = Instant.now() // 获取当前偏移(会自动识别夏令时/标准时) val currentOffset = targetZone.rules.getOffset(now) // 判断当前是否处于夏令时 val isDaylight = targetZone.rules.isDaylightSavings(now) println("当前时区偏移: $currentOffset") println("是否处于夏令时: $isDaylight") }
运行后对比北卡当地的实际时区信息,就能确认该ID是否符合要求。
3. 排除无关候选的技巧
从你给出的筛选结果里,这些候选可以直接排除:
- 带
Indiana的ZoneId:属于印第安纳州的特殊时区(部分区域曾不执行夏令时),和北卡无关 America/Panama、America/Havana等:属于其他国家的时区,规则可能存在差异America/Detroit、America/Montreal等:虽然偏移相同,但属于其他地区的时区ID,语义上不如America/New_York精准
如果想缩小筛选范围,可以优化代码,只保留美国本土相关的候选:
import java.time.* import java.time.ZoneId.getAvailableZoneIds fun getUsEasternZoneCandidates() = getAvailableZoneIds() // 只保留美国东部核心地区的时区 .filter { it.startsWith("America/") && it.split("/")[1] in listOf("New_York", "Boston", "Philadelphia") } .map { ZoneId.of(it) } .map { it to it.rules.getStandardOffset(Instant.now()) } .filter { it.second == ZoneOffset.ofHours(-5) } fun main() { getUsEasternZoneCandidates().forEach { println(it.first) } }
内容的提问来源于stack exchange,提问作者Jeff C Johnson
相关产品推荐
相关产品推荐

