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()); }
控制台输出: