我是靠谱客的博主 斯文秋天,最近开发中收集的这篇文章主要介绍这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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"));

最后

以上就是斯文秋天为你收集整理的这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime的全部内容,希望文章能够帮你解决这么详细的Java8日期时间API,还不赶紧收藏起来(四):ZoneId和ZonedDateTime所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部