这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime

本文深入探讨了Java中ZoneId类的使用,包括时区ID的类型和常见时区的表示,以及ZonedDateTime类如何结合LocalDateTime和ZoneId提供带时区的日期时间表示。通过实例展示了如何获取、转换时区,以及LocalDateTime到ZonedDateTime的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ZoneId

java.time.ZoneId类表示时区ID

声明:

public abstract class ZoneId implements Serializable 

ZoneId可以用于在Instant和LocalDateTime之间转换的规则。 有两种不同类型的ID:

固定偏移量 - 从UTC /格林威治完全解析的偏移量,对所有本地日期时间使用相同的偏移量

地理区域 - 适用于查找UTC /格林威治的偏移量的特定规则集的区域

ZoneId里有一个SHORT_IDS的map,里面包含了我们常用的时区,我们如果想用某个时区,可以在这个map中取出来

如下

public static final Map<String,String> SHORT_IDS


以下是KEY和VALUE
ACT - 澳大利亚/达尔文
澳大利亚/悉尼
AGT - 美洲/阿根廷/布宜诺斯艾利斯
艺术 - 非洲/开罗
AST - 美国/安克拉治
BET - America / Sao_Paulo
BST - 亚洲/达卡
CAT - 非洲/哈拉雷
CNT - America / St_Johns
CST - 美国/芝加哥
CTT - 亚洲/上海
EAT - 非洲/ Addis_Ababa
ECT - 欧洲/巴黎
IET - 美洲/印第安纳州/印第安纳州
IST - 亚洲/加尔各答
JST - 亚洲/东京
麻省理工学院 - 太平洋/阿皮亚
NET - 亚洲/埃里温
NST - 太平洋/奥克兰
PLT - 亚洲/卡拉奇
PNT - 美国/凤凰城
PRT - 美洲/波多黎各
PST - 美国/ Los_Angeles
太平洋岛屿/瓜达尔卡纳群岛
VST - 亚洲/ Ho_Chi_Minh

例:获取上海的时区,上海时区的key为CTT。ZoneId.systemDefault为获取系统默认的时区,也是十分常用的方法

System.out.println(ZoneId.SHORT_IDS.get("CTT"));
System.out.println(ZoneId.systemDefault());

输出:

Asia/Shanghai
Asia/Shanghai

常用方法
static ZoneId of(String zoneId):从传入的zoneId获取ZoneId的实例

static Set getAvailableZoneIds():获取可用的ZoneId,返回一个set集合。可以使用迭代器遍历,或者for循环遍历

例:

   Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
   for (String availableZoneId : availableZoneIds) {
        System.out.println(availableZoneId);
    }

ZonedDateTime

ZonedDateTime表示一个带有时区的日期时间的不可变表示。 此类存储所有日期和时间字段,精度为纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。 例如,“2007-12-03T10:15:30+01:00 Europe/Paris ”可以存储在ZonedDateTime 。

声明:

public final class ZonedDateTime implements Temporal, ChronoZonedDateTime<LocalDate>, Serializable {

实现

可以看作是LocalDateTime和ZoneId 的结合

ZonedDateTime拥有相当于三个独立对象的状态,一个LocalDateTime ,一个ZoneId和解决的ZoneOffset 。 偏移量和本地日期时间用于在必要时定义一个瞬间。 区域ID用于获取偏移量如何以及何时更改的规则。 偏移不能自由设置,因为区域控制哪些偏移是有效的。
这个类是不可变的和线程安全的。

日常使用

    // 默认时区获取当前时间
    ZonedDateTime zonedDateTime = ZonedDateTime.now();
    // 用指定时区获取当前时间,Asia/Shanghai为上海时区
    ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
    //withZoneSameInstant为转换时区,参数为ZoneId
    ZonedDateTime zonedDateTime2 = zonedDateTime.withZoneSameInstant(ZoneId.of("America/New_York"));

输出

2020-06-17T11:00:29.716404400+08:00[Asia/Shanghai]
2020-06-17T11:00:29.716404400+08:00[Asia/Shanghai]
2020-06-16T23:00:29.716404400-04:00[America/New_York]

LocalDateTime转ZonedDateTime,只需要使用LocalDateTime的atZone方法,传入一个时区,即可得到对应的ZonedDateTime

例:

 LocalDateTime localDateTime=LocalDateTime.now();
 ZonedDateTime zonedDateTime3 = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值