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