当前位置:   article > 正文

hutool获取5天前的日期_JDK8新日期类(一)

hutool 获取几天前

大纲

def0f1440a7e5c34090f891194e2bcd3.png

新日期类的出现

  JDK8之前的日期类计算两个时间的差值比较麻烦,比如说求出两个时间的间隔天数需要做很多操作。在格式化和解析时间方面,SimpleDateFormat类是线程不安全的,在多线程的情况下,可能会出现解析异常的情况。

  下面举个例子看下:

  1. /** * 测试SimpleDateFormat的线程不安全问题 */@Testpublic void testOldFormat(){
  2.     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    for (int i = 0; i 20; i++) {
  3.         new Thread(()->{
  4.             try {
  5.                 Date date = dateFormat.parse("2020-08-05 23:13:54");                System.out.println(date);            } catch (ParseException e) {
  6.                 e.printStackTrace();            }        }).start();    }}

  运行上面的代码后,可能会出现异常和解析时间错误的情况,此次我出现的异常如下:

Exception in thread "Thread-3" Exception in thread "Thread-2" java.lang.NumberFormatException: For input string".220222022202E" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65at java.lang.Long.parseLong(Long.java:578at java.lang.Long.parseLong(Long.java:631at java.text.DigitList.getLong(DigitList.java:195at java.text.DecimalFormat.parse(DecimalFormat.java:2051at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514at java.text.DateFormat.parse(DateFormat.java:364)Wed Aug 05 23:13:54 CST 2020 at com.gsgb.local.LocalTest.lambda$testOldFormat$0(LocalTest.java:43at java.lang.Thread.run(Thread.java:748)

  这也说明了SimpleDateFormat类是线程不安全的。

  总的来说,JDK8之前的日期类的问题有:

  • 设计不合理。例如util包的Date类里面已经有很多类过时了。用于解析的类在java.text包里,而且线程不安全。
  • 线程不安全util包的Date类也是线程不安全的,类没有用final修饰,是可变的。而新日期类基本都是不可变的类。
  • 时区相关问题不好处理。

基本日期类

  本节主要说说LocalDateTime、LocalDate、LocalTime,由于它们的用法基本上相同,主要针对LocalDateTime讲解。

获取当前时间

  JDK8之前的日期类有线程安全的问题,JDK8的新日期类大部分都是final修饰的,是不可变的,而且其构造函数都是私有的,我们需要调用静态方法生成日期类的对象。

  1. /** * now方法获取当前时间 */@Testpublic void testNow() {
  2.     LocalDateTime localDateTime = LocalDateTime.now();    LocalDate localDate = LocalDate.now();    LocalTime localTime = LocalTime.now();    System.out.println("localDateTime的时间是: " + localDateTime);    System.out.println("localDate的时间是: " + localDate);    System.out.println("localTime的时间是: " + localTime);}

控制台:

localDateTime的时间是:2020-08-05T23:41:00.902localDate的时间是:2020-08-05localTime的时间是:23:41:00.903

一些常量

  在上面三个日期类中有一些静态常量,我觉得LocalTime的还有点用,其他的用处好像不是很大,感兴趣可以去翻下源码看看:

  1. /** * 获取一些常量 * 测试时间日期类的一些常量 * 主要看{
  2. @link LocalTime}的一些 */@Testpublic void testConstant() {
  3.     System.out.println("某一天的结束时间是: " + LocalTime.MAX);    System.out.println("某一天的开始时间是: " + LocalTime.MIN);    System.out.println("某一天的半夜时间是: " &
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/260646
推荐阅读
相关标签
  

闽ICP备14008679号