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

 更新时间:2022年1月9日 14:14  点击:560 作者:wbo112

前言

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开始的夏令时。

简单来说就是在夏令时开始的时候,将时钟向后拨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

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

总结

到此这篇关于Java8中时间处理的文章就介绍到这了,更多相关Java8时间处理内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/wbo112/article/details/122372590

[!--infotagslink--]

相关文章

  • Java8 实现stream将对象集合list中抽取属性集合转化为map或list

    这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • java8中的Collectors.groupingBy用法详解

    这篇文章主要介绍了java8中的Collectors.groupingBy用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-17
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • 教你怎么用Java获取国家法定节假日

    这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
  • mysql中获取一天、一周、一月时间数据的各种sql语句写法

    创建表:复制代码 代码如下:create table if not exists t( id int, addTime datetime default '0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07...2014-05-31
  • .NET/C# 使用Stopwatch测量运行时间

    这篇文章主要介绍了.NET/C# 使用Stopwatch测量运行时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Java8处理List的双层循环问题

    这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
  • 浅谈Java8 的foreach跳出循环break/return

    这篇文章主要介绍了Java8 的foreach跳出循环break/return,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28
  • JavaScript时间操作之年月日星期级联操作

    这篇文章主要介绍了JavaScript时间操作之级联日期选择操作,涉及到年、月、日、星期,感兴趣的小伙伴们可以参考一下...2016-01-18
  • C#中动态显示当前系统时间的实例方法

    想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
  • 非常全面的php日期时间运算汇总

    实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • postgresql 中的时间处理小技巧(推荐)

    这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • 从chrome调试工具中把拖延时间的东西找出来

    我打开android开发手册的时候:http://www.csdn123.com/html/android/reference/packages.html 发现打开速度很慢,我用按了一下F12打开调试面板,切换到网络的选项卡network...2016-05-19
  • Java8 使用流抽取List<T>集合中T的某个属性操作

    这篇文章主要介绍了Java8 使用流抽取List<T>集合中T的某个属性操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
  • C# 当前系统时间获取及时间格式详解

    这篇文章主要介绍了C# 当前系统时间获取及时间格式详解的相关资料,这里提供代码实例,帮助大家学习参考,需要的朋友可以参考下...2020-06-25
  • 帝国CMS显示指定时间内更新的信息数量

    /*解决代码高亮太长不换行*/ .syntaxhighlighter{word-break:break-all;} uParse('#newstext', {rootPath: '/e/extend/ueditor/'}) 帝国CMS显示指定时间内更新的信息数...2016-11-01
  • C#使用TimeSpan时间计算的简单实现

    这篇文章主要给大家介绍了关于C#使用TimeSpan时间计算的相关资料,以及通过一个实例代码给大家介绍了C#使用timespan和timer完成一个简单的倒计时器的方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...2020-06-25
  • php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法

    php获取今日开始时间戳和结束时间戳$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;//php获取昨日起始时间戳和结束时间...2013-10-04