今天就跟大家聊聊有关如何搞懂Java8中的时间处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
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.now()
就可以基于当前默认时区得到当前的日期时间。
由于全球有好多时区,同一个日期时间,在不同的时区,反映到时间轴上是不同的。
LocalDateTime类型的日期时间是没包含时区,所以它不能对应到时间轴上。说的直白点就是LocalDateTime不能转换成自 1970-01-01T00:00:00Z 纪元以来的毫秒数。
ZonedDateTime可以理解就是在LocalDateTime的基础上添加上时区,所以它是可以反映到时间轴上的。
下面用夏令时举个例子来看看LocalDateTime和LocalDateTime的区别。
夏令时是什么这里就不展开了,具体可以网上查下。看看我国1986开始的夏令时。
简单来说就是在夏令时开始的时候,将时钟向后拨1个小时。对应我国1986年开始的夏令时的做法,就是在每年四月中旬的第一个星期日当时钟到达凌晨2点时,直接将时钟拨到凌晨3点。也就是凌晨1点和凌晨3点之间之差1个小时。
由于1986年是开始实施的,所以1986年的夏令时是1986年5月4日开始的。
我们看看1987年的夏令时开始
根据我国当时的夏令时政策,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表示时间轴上的一个瞬时时间,简单来说就是表示自 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();
看完上述内容,你们对如何搞懂Java8中的时间处理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。