时间戳转localdatetime_LocalDateTime详解

113fb35582ef00090cc8527361c5ab8a.gif 点击上面 “蓝字”关注我哦!

1.前言

在java8以前,或许:

  • 当你在做有关时间日期的操作时,你会想到用Date;

  • 当你在做日期、月份、天数相加减时,你会想到用Calendar;

  • 当你需要对时间日期进行格式化时,你会想到使用SimpleDateFormat或DateFormat下的其他子类;
    ……

但是,你必须知道,以上有关的时间日期操作对象,都是可变的、线程不安全的,同时,如果作为一个经常写过类似代码的人来说,尽管有相关对象提供某些操作,但并不能很快、很简单的就能得到最终想要的结果,如:要计算两个时间点之间相差的年、月、日、周、时、分、秒等,这些计算尽管原有API也能够实现,但原有API除了线程不安全之外,另外一个不足之处就是代码繁琐,性能低! 为何我们总提多线程下,线程不安全?对于初学者来说,可能觉得能够简单实现出功能就已经足够,但是真正的开发项目是不可能仅仅考虑功能的实现的,还要考虑项目的安全性、稳定性、高性能、高可用性等等!因此,作为java开发者,多线程的知识是必不可少的。而也正因为多线程,才会出现一大堆问题(简称线程安全性问题),作为开发者,就应该写出不仅能实现功能的代码,还要是线程安全的代码。那么,学习并熟悉掌握新的线程安全的API就显得非常重要了! 没错,java8出的新的时间日期API都是线程安全的,并且性能更好,代码更简洁!

2.新时间日期API常用、重要对象介绍

  • ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则

  • Instant: 用来表示时间线上的一个点(瞬时)

  • LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的

  • LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的

  • LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的

  • Clock: 用于访问当前时刻、日期、时间,用到时区

  • Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔

  • Period: 用于计算两个“日期”间隔

2.DateTimeFormatter

如果要自定义输出的格式,或者要把一个非ISO8601格式的字符串解析成LocalDateTime,可以使用新的DateTimeFormatter :

4144f50716bbc9bf57db49506b948b52.png

LocalDateTime提供了对日期和时间进行加减的非常简单的链式调用:

b2178a88be36c456084fb8305847ee28.png

注意到月份加减会自动调整日期,例如从2019-10-31减去1个月得到的结果是2019-09-30,因为9月没有31日。 对日期和时间进行调整则使用withXxx()方法,例如:withHour(15)会把10:11:12变为15:11:12:
  • 调整年:withYear()

  • 调整月:withMonth()

  • 调整日:withDayOfMonth()

  • 调整时:withHour()

  • 调整分:withMinute()

  • 调整秒:withSecond()

1ae298e85d86764fba0c05b323ad6aff.png

同样注意到调整月份时,会相应地调整日期,即把2019-10-31的月份调整为9时,日期也自动变为30。实际上,LocalDateTime还有一个通用的with()方法允许我们做更复杂的运算。例如:

c8f976ff6b8683b3b0241b023de81d21.png

对于计算某个月第1个周日这样的问题,新的API可以轻松完成。要判断两个LocalDateTime的先后,可以使用isBefore()、isAfter()方法,对于LocalDate和LocalTime类似:

c5644d3716ef94a63c742d9b55383a60.png

注意到LocalDateTime无法与时间戳进行转换,因为LocalDateTime没有时区,无法确定某一时刻。后面我们要介绍的ZonedDateTime相当于LocalDateTime加时区的组合,它具有时区,可以与long表示的时间戳进行转换。

d719c077c8ea47513a7e102480cc71ef.gif

小结

  • Java 8引入了新的日期和时间API,它们是不变类,默认按ISO 8601标准格式化和解析;

  • 使用LocalDateTime可以非常方便地对日期和时间进行加减,或者调整日期和时间,它总是返回新对象;

  • 使用isBefore()和isAfter()可以判断日期和时间的先后;

点个赞

7f43068029b7cdb8d4faf36d47ff39c6.gif

再走吧

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值