ITPub博客

首页 > 数据库 > 数据库开发技术 > 是时候抛弃java.util.Date了,用LocalDateTime重构你的DateUtils工具类

是时候抛弃java.util.Date了,用LocalDateTime重构你的DateUtils工具类

原创 数据库开发技术 作者:MavenTalk 时间:2019-12-31 08:12:00 0 删除 编辑

题图 from pixabay

随便打开一个你参与过的项目,想必里面都有一个DateUtils的工具类,用于处理日期之前的那些事儿,这是我用过的一个,我们来看一下:

工具类中经常用到的有三个类:

  1. java.util.Date

  2. java.util.Calendar

  3. java.text.SimpleDateFormat

Date类中有很多方法都是过期不建议使用的,SimpleDateFormat使用时也是非线程安全的,在多线程环境下需要特殊处理来应对正常使用时不出错。在字符串与日期相互转换,日期计算时,很多方法也不那么优雅。

  1. /

  2. *

  3. * Date formats are not synchronized.

  4. * It is recommended to create separate format instances for each thread.

  5. * If multiple threads access a format concurrently, it must be synchronized

  6. * externally.

  7. * @see java.util.Calendar

  8. * @see java.util.TimeZone

  9. * @seeDateFormat

  10. * @seeDateFormatSymbols

  11. * @authorMarkDavis, Chen-LiehHuang, AlanLiu

  12. */

  13. publicclassSimpleDateFormatextendsDateFormat{}

有没有更优雅的方法来处理日期计算呢,Jdk 8 之后,引入了LocalDateTime,就是要替代旧有Date处理方式,并且都有很鲜明的特性:他们都是immutable and thread-safe,在多线程环境中可以放心使用。打开源文件,就可以看到类似的注释:

  1. / * @implSpec

  2. * Thisclass is immutable and thread-safe.

  3. *

  4. * @since1.8

  5. */

对比上面常用的三个类,DateUtils工具就可以用如下几个工具类重构:

  1. java.time.format.DateTimeFormatter,对标SimpleDateFormat

  2. java.time.LocalDateTime,日期 + 时间,设置含年月日时分秒的格式

  3. java.time.LocalDate,设置仅含年月日的格式

  4. java.time.LocalTime,设置仅含时分秒的格式

  5. java.time.Period,用于计算两个“日期”间隔

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

  7. java.time.Instant,用来表示时间线上的一个点(瞬时),与Date可以相互转换

下面来看几个常见的用法:

  1. LocalDate localDate = LocalDate.now();

  2. LocalTime localTime = LocalTime.now();

  3. LocalDateTime localDateTime = LocalDateTime.now();

  4. System.out.println("localDate = "+ localDate + "/localTime = "+ localTime);

  5. System.out.println("localDateTime = "+ localDateTime);

  6. //前端需要的日期格式一般为yyyy-MM-dd HH:mm:ss,这里要重新格式化

  7. System.out.println("格式化后的localDateTime"+ localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")));


  8. 输出结果如下:

  9. localDate = 2019-12-27/localTime = 16:34:35.165

  10. localDateTime = 2019-12-27T16:34:35.165

  11. 格式化后的localDateTime2019-12-2716:34

再看看日期比较的例子:

  1. LocalDateTime l1 = LocalDateTime.now().withMonth(2);

  2. LocalDateTime l2 = LocalDateTime.now().withMonth(5);

  3. //计算这两个日期隔了几个月

  4. System.out.println(Duration.between(l1, l2).toDays());

  5. //两个日期的先后顺序

  6. System.out.println(l1.isAfter(l2));


  7. LocalDate ld1 = LocalDate.now().withMonth(1);

  8. LocalDate ld2 = LocalDate.now().withMonth(5);

  9. //计算这两个日期隔了几个月

  10. System.out.println(Period.between(ld1, ld2).toTotalMonths());


  11. LocalTime lt1 = LocalTime.now().withHour(2);

  12. LocalTime lt2 = LocalTime.now().withHour(12).withMinute(30);

  13. //计算这两个日期隔了几小时

  14. System.out.println(Duration.between(lt1, lt2).toHours());


  15. -----输出结果----

  16. 89

  17. false

  18. 4

  19. 10

下面来看看这些类中常用的方法

看了这么多,你还要继续使用Date或SimpleDateFormat吗?现在就行动起来。

 -End- 
长按2秒,识别二维码,关注我
回复“150”,获取知乎高赞回答150本优秀书籍

拓展阅读:

开源分布式事务解决方案-Seata,1.0.0版发布了

Hutool--小而全的Java工具类库

一款技术人成长的神兵利器,值得推荐

一年如何阅读50本书

做一个有远见的程序员

为什么技术团队领导者多是后台开发人员

为什么很多大龄程序员说"技术不重要"

原文作者:MavenTalk;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2016-07-13

  • 博文量
    461
  • 访问量
    189244