Java8 LocalDate、LocalDateTime、LocalTime、Instant

Java8日期时间API,新增了LocalDate、LocalDateTime、LocalTime等线程安全类,下面简单介绍他们的使用及Date与LocalDate互转。

 1、LocalDate、LocalDateTime、LocalTime

LocalDate 是日期:2022-09-21

LocalDateTime 是日期和时间:2022-09-21 15:20:10

LocalTime 是时间:15:20:16

定义当前时间使用自带的now() 方法:

LocalDate.now();

LocalDateTime.now();

LocalTime.now();

定义指定时间:

LocalTime time = LocalTime.of(11,11,11);
LocalDate date = LocalDate.of(2022,9,21);
LocalDateTime lt = LocalDateTime.of(date, time);

时间与字符串的相互转化
DateTimeFormatter 将时间转成字符串,或将字符串转成时间

定义:df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

时间转字符串:

df.format(LocalDateTime.now())

字符串转化成时间:

LocalDateTime.parse("2022-09-21 15:31:19",df)

日期及时间的的转换也可以使用相同的方式。

两个时间的比较,返回结果true/false

isAfter();

isBefore()

LocalDateTime.now().isAfter(dt2);

例子1:

   /**      * LocalDate 与 String 之间的转换      */     @Test     public void localDateToString(){         LocalDate today = LocalDate.now();         DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");         String dateStr = today.format(fmt);         System.out.println("dateStr:"+dateStr);          String str = "2022-09-22";         //指定转换格式         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");         //进行转换         LocalDate date = LocalDate.parse(str, dateTimeFormatter);         System.out.println("date:"+date);      }

控制台输出:

例子2:

    @Test     public void  testDate(){         Date date = new Date();         LocalDate localDate = LocalDate.now();         System.out.println("localDate:"+localDate);         LocalDateTime localDateTime = LocalDateTime.now();         System.out.println("localDateTime:"+localDateTime);         LocalTime localTime= LocalTime.now();         System.out.println("localTime:"+localTime);         //Date转LocalDate         System.out.println("Date转LocalDate:");         System.out.println("DateToLocalDate:"+date2LocalDate(date));         //LocalDate转Date         System.out.println("LocalDate转Date:");         System.out.println("LocalDateToDate:"+localDate2Date(localDate));     }     /**      * Date转LocalDate      * @param date      */     public static LocalDate date2LocalDate(Date date) {         if(null == date) {             return null;         }         return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();     }     /**      * LocalDate转Date      * @param localDate      * @return      */     public static Date localDate2Date(LocalDate localDate) {         if (null == localDate) {             return null;         }         ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());         return Date.from(zonedDateTime.toInstant());     }

控制台输出:

 2、Instant

    @Test     public void testInstant(){         Instant now = Instant.now();         System.out.println("现在时间:"+now);         /**          * 注意:通过这种方式获取的时间戳与北京时间相差8个时区,需要修正为北京时间,          * 通过查看源代码发现Instant.now()使用等是UTC时间Clock.systemUTC().instant()。LocalDate、LocalDateTime          * 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。          * 解决方法:增加8个小时          */         Instant now1 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));         System.out.println("修正后的现在时间:"+now1);          //Instant获取long类型的10位秒数、13位毫秒数         Instant now2 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));         System.out.println("秒数:"+now2.getEpochSecond());         System.out.println("毫秒数:"+now2.toEpochMilli());          //LocalDateTime输出毫秒数的方式,比Instant多一步转换         LocalDateTime localDateTime = LocalDateTime.now();         //LocalDateTime转Instant         Instant localDateTime2Instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();         System.out.println("LocalDateTime 毫秒数:"+localDateTime2Instant.toEpochMilli());     }

控制台输出: