Java中ZonedDateTime使用详解及时间转化(java中获取时区)

1、概述

带时区的日期和时间:ZoneDateTime

2、认识时区图

不同的国家处在不同的时区上,伦敦为中时区,中国采用东八区时间,意思是比标准时间早八个小时。

由于地球是圆形的,根据地球自转的方向,东八区会比中时区提前进入新的一天,看见太阳。

Java中的ZoneDateTime就可以获取同一天,不同时区的时间。

a4db500e2d4f4b4faa6c7a71798deb05.png3、获得时区的方式

//获取所有时区,输出:[Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi,……
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
//获取当前计算机默认的时区,也就是东八区时间
ZoneId zoneId= ZoneId.systemDefault();//输出:Asia/Shanghai

4、ZoneDateTime使用

4.1、获取标准中时区时间

美国伦敦时间,UTC

ZonedDateTime zoneDateTimeNow01 = ZonedDateTime.now(Clock.systemUTC());

4.2、获取指定时区的时间

ZoneId zoneId= ZoneId.systemDefault();//获取当前计算机默认的时区,也就是东八区时间
ZonedDateTime zoneDateTimeNow03 = ZonedDateTime.now(zoneId);

4.3、获取东八区时间

//LocalDateTime能够获取当前东八区的时间
LocalDateTime localDateTimeNow = LocalDateTime.now();

5、使用ZoneDateTime转换时间

说明1:Z(zero)是表示0时区,对我们国家来说,采用北京时间,处于东八区 UTC+8。所以带Z的时间格式,转换成北京时间需要加上 8 个小时。

说明2:T:表示时间元素的开始。

5.1、字符串转ZonedDateTime

public static void main(String[] args) {
		//获取默认的时区,输出为:Asia/Shanghai
		ZoneId zoneId= ZoneId.systemDefault();
		//定时时间格式,T表示时间元素的开始,
		String timePattern = "yyyy-MM-dd'T'HH:mm:ssZ";
		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(timePattern);
		//定义一个字符串类型的时间
		String  time1="2023-06-06T00:18:14+0800";
		//将时间类型的字符串转化成ZonedDateTime
		ZonedDateTime zonedDateTime1 =
	            ZonedDateTime.parse(time1, dateTimeFormatter);
		//获取东八区时间
		 ZonedDateTime ZonedDateTime2 =
				 zonedDateTime.withZoneSameInstant(zoneId);
		//输出:2023-06-06T00:18:14+08:00[Asia/Shanghai]
		System.out.println(ZonedDateTime2);
	}

5.2、ZonedDateTime转LocalDateTime/LocalDate/LocalTime

【代码】

public static void main(String[] args) {
		ZonedDateTime  zonedDateTime = ZonedDateTime.now();
		//转LocalDate
		LocalDate localDate= zonedDateTime.toLocalDate();
		System.out.println("localDate=>"+localDate);
		//LocalTime
		LocalTime localTime= zonedDateTime.toLocalTime();
		System.out.println("localTime=>"+localTime);
		//转LocalDateTime
		LocalDateTime localDateTime= zonedDateTime.toLocalDateTime();
		System.out.println("localDateTime=>"+localDateTime);
		//转Instant
		Instant instant= zonedDateTime.toInstant();
		System.out.println("instant=>"+instant);
	}

【输出结果】

localDate=>2023-06-06
localTime=>00:57:07.011
localDateTime=>2023-06-06T00:57:07.011
instant=>2023-06-05T16:57:07.011Z

6、JDK.8日期和时间API概述

新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。

其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。

LocalDateTime是JDK1.8开始的新特性,主要的核心类有:

1、时间和日期类:LocalDateTime-获取年月日时分秒   LocalDate-年月日   LocalTime-时分秒

【2、带时区的日期和时间:ZonedDateTime】

【3、时刻:Instant是时间线上的一个瞬时点。】

Java中Date类的toInstant()方法用于将Date对象转换为Instant对象。在转换过程中会创建一个Instant,用于表示时间轴上与此日期相同的点。

【4、时区:ZoneId,ZoneOffSet】

java.time.ZoneOffset.ofHours(int hours)方法使用以小时为单位的偏移量获取 ZoneOffset 的实例

ZoneId.systemDefault():获取时区名称 输出:Asia/Shanghai

【5、时间间隔:Period,Duration】

6、Month月份

7、Week周

8、Clock:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值