一篇文章弄懂Java8中的时间处理

作者:wbo112 时间:2022-07-22 07:56:32 

前言

java8借鉴了第三方日期库joda很多的优点

java.time包

类名描述
Instant时间戳
Duration持续时间,时间差
LocalDate只包含日期,比如:2020-05-20
LocalTime只包含时间,比如:13:14:00
LocalDateTime包含日期和时间,比如:2020-05-20 13:14:00
Period时间段
ZoneOffset时区偏移量,比如:+8:00
ZonedDateTime带时区的时间
Clock时钟,比如获取目前美国纽约的时间

java.time.format包

类名描述
DateTimeFormatter时间格式化

Java8提供了全新的时间处理框架,这里就可以完全丢弃之前的Date、Calendar了。

具体的API的使用都是比较简单的。这里就不展开介绍了。

这里主要介绍下一些主要的类

LocalDateTime

我们一般常用的就是这个了,用这个来表示日期时间。如LocalDateTime.now()就可以基于当前默认时区得到当前的日期时间。

由于全球有好多时区,同一个日期时间,在不同的时区,反映到时间轴上是不同的。

LocalDateTime类型的日期时间是没包含时区,所以它不能对应到时间轴上。说的直白点就是LocalDateTime不能转换成自 1970-01-01T00:00:00Z * 以来的毫秒数

ZonedDateTime

ZonedDateTime可以理解就是在LocalDateTime的基础上添加上时区,所以它是可以反映到时间轴上的。

下面用夏令时举个例子来看看LocalDateTime和LocalDateTime的区别。

夏令时是什么这里就不展开了,具体可以网上查下。看看我国1986开始的夏令时。

一篇文章弄懂Java8中的时间处理

简单来说就是在夏令时开始的时候,将时钟向后拨1个小时。对应我国1986年开始的夏令时的做法,就是在每年四月中旬的第一个星期日当时钟到达凌晨2点时,直接将时钟拨到凌晨3点。也就是凌晨1点和凌晨3点之间之差1个小时。

由于1986年是开始实施的,所以1986年的夏令时是1986年5月4日开始的。

我们看看1987年的夏令时开始

一篇文章弄懂Java8中的时间处理

根据我国当时的夏令时政策,1987年应该是1987年4月12日开始的。具体来说就是在1987-04-12 01:00:00 过一个小时后,时间应该是1987-04-12 03:00:00

LocalDateTime localDateTime = LocalDateTime.of(1987, 4, 12, 1, 0, 0, 0);
       System.out.println(localDateTime);
       System.out.println(localDateTime.plusHours(1));

执行上面的代码就可以看到当1987-04-12 01:00:00增加1小时后,时间是1987-04-12 02:00:00。

这个也好理解,因为LocalDateTime并没有包含时区,1987-04-12 02:00:00这个夏令时只是中国的,并不是全球统一的,如果1987-04-12 02:00:00将直接变成1987-04-12 03:00:00放到中国以外的其他国家就是错误的。

ZonedDateTime zonedDateTime = ZonedDateTime.of(1987, 4, 12, 1, 0, 0, 0, ZoneId.systemDefault());
       System.out.println(zonedDateTime);
       System.out.println(zonedDateTime.plusHours(1));

执行上面的代码可以看到当1987-04-12 01:00:00增加1小时后,时间变成了是1987-04-12 03:00:00。这个也就能说明问题了。

同时从打印结果也能看到时区自动从+08:00[Asia/Shanghai]变成了+09:00[Asia/Shanghai]

Instant

Instant表示时间轴上的一个瞬时时间,简单来说就是表示自 1970-01-01T00:00:00Z * 以来的秒数、毫秒数等等

ZonedDateTime和Instant都能对应到时间轴上,所以它们两个是可以相互转化的。

Instant instant = zonedDateTime.toInstant();
       ZonedDateTime zonedDateTime1 = instant.atZone(zonedDateTime.getZone());

其他一些常用的各种类型之间转化的API

//ZonedDateTime 转  Instant
       Instant instant = ZonedDateTime.now().toInstant();

//获取UTC毫秒数
       long epochMilli = instant.toEpochMilli();

//Instant 转  ZonedDateTime
       ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

//字符串 转  ZonedDateTime
       ZonedDateTime zonedDateTime2 = ZonedDateTime.parse(zonedDateTime.toString());

//基于UTC 偏移的毫秒数
       int totalSeconds = zonedDateTime.getOffset().getTotalSeconds();

//Instant 转  LocalDateTime
       LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

//LocalDateTime 转  ZonedDateTime
       ZonedDateTime zonedDateTime1 = localDateTime.atZone(ZoneId.systemDefault());

ZoneRules zoneRules = ZoneId.systemDefault().getRules();

//判断是否是夏令时时间
       boolean daylightSavings = zoneRules.isDaylightSavings(instant);

Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
       //Calendar 转 Instant
       Instant instant1 = calendar.toInstant();

//Calendar  转   ZonedDateTime
       Calendar now = Calendar.getInstance();
       ZonedDateTime zdt = ZonedDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()));

//Date 转 Instant
       Date date = new Date();
       Instant inst = date.toInstant();

// Instant 转 Date
       Date newDate = Date.from(inst);

//GregorianCalendar 转 ZonedDateTime
       GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
       TimeZone tz = cal.getTimeZone();
       ZonedDateTime zdt1 = cal.toZonedDateTime();

//ZonedDateTime 转 GregorianCalendar
       GregorianCalendar newCal = GregorianCalendar.from(zdt1);

LocalDateTime ldt = zdt.toLocalDateTime();
       LocalDate date2 = zdt.toLocalDate();
       LocalTime time2 = zdt.toLocalTime();

更详细的资料,还是看官方的文档吧。https://docs.oracle.com/javase/tutorial/datetime/index.html

来源:https://blog.csdn.net/wbo112/article/details/122372590

标签:java8,时间,instantly
0
投稿

猜你喜欢

  • C#中的yield关键字详解

    2023-01-11 08:19:01
  • Android高级组件ImageSwitcher图像切换器使用方法详解

    2023-11-07 13:18:19
  • 详解Java反射创建对象

    2022-12-10 03:52:23
  • 详解Java中使用泛型实现快速排序算法的方法

    2022-04-28 09:47:00
  • Java Spring详解如何配置数据源注解开发以及整合Junit

    2021-10-31 11:03:25
  • Java实现将彩色PDF转为灰度PDF的示例代码

    2022-11-26 19:47:41
  • C# dll代码混淆加密的实现

    2022-01-06 17:25:04
  • 人工智能开发语言排行榜: 不死Java, 不朽C/C++, 新贵Python【推荐】

    2023-03-12 16:06:54
  • Java循环对bean的属性进行赋值的实现

    2023-01-27 10:18:05
  • C# InitializeComponent()方法案例详解

    2022-06-12 03:07:06
  • Spring Cloud Config 使用本地配置文件方式

    2021-06-03 03:17:53
  • C#定时器和随机数

    2023-10-28 15:30:34
  • Android动画之逐帧动画(Frame Animation)实例详解

    2023-02-27 06:12:56
  • Android列表点击事件定义的一些思考

    2021-12-24 08:41:40
  • ionic App 解决android端在真机上tab处于顶部的问题

    2022-05-11 21:56:57
  • Java中DecimalFormat用法及符号含义

    2023-05-04 04:31:14
  • JAVA并发图解

    2023-03-26 03:11:41
  • Android编程中自定义dialog用法实例

    2023-05-10 07:21:37
  • Android使用ViewPager实现类似laucher左右拖动效果

    2022-05-18 20:33:59
  • IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    2022-03-15 05:16:02
  • asp之家 软件编程 m.aspxhome.com