JDK8新特性提供了3个时间类:LocalDate、LocalTime、LocalDateTime.
以前一直使用的是Date类,如果需要打印时间字符串,需要使用SimpleDateFormat类:
Date date=new Date();
System.out.println(date); ---> Mon Apr 19 13:39:06 CST 2021
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date)); ---> 2021-04-19 13:39:06
如果使用jdk8新特性LocalDateTime,如果需要打印时间字符串,需要使用DateTimeFormatter类:
LocalDateTime localDateTime=LocalDateTime.now();
System.out.println(localDateTime); ---> 2021-04-19T13:42:58.546
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String localDateTimeStr=dateTimeFormatter.format(localDateTime);
System.out.println(localDateTimeStr); ---> 2021-04-19 13:42:58
现目前在定时JAVA POJO类的时候,属性还是使用Date, 但是在程序里面对于时间的计算的话,为了方便,建议把Date转为LocalDateTime之后,使用LocalDateTime提供的API来计算。
/**
* 把Date类型转为LocalDateTime类型
* @param date
* @return
*/
public static LocalDateTime date2LocalDateTime(Date date){
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime;
}
/**
* 把LocalDateTime转为Date类型
* @param localDateTime
* @return
*/
public static Date localDateTime2Date( LocalDateTime localDateTime){
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
使用了LocalDateTime之后,使用它的API十分方便:
//获取当前日期
LocalDate localDate=LocalDate.now();
//打印年月日
System.out.println(localDate.toString()); ---> 2021-04-19
//打印年
System.out.println(localDate.getYear()); ---> 2021
//打印月
System.out.println(localDate.getMonth().getValue()); ---> 4
//打印日
System.out.println(localDate.getDayOfMonth()); ---> 19
//打印日
System.out.println(localDate.getDayOfYear()); ---> 109
//打印日 星期几
System.out.println(localDate.getDayOfWeek().getValue()); --->1
/ 获取当前时间
LocalTime localtime= LocalTime.now();
System.out.println(localtime); ---> 11:48:30.556 带有毫秒值
System.out.println(localtime.withNano(0)) --->11:48:30 不在毫秒值 还有withHour(0)等方法把小时设置为0
// 设置时间
LocalTime localTime = LocalTime.of(13, 51, 10);
//获取小时
int hour = localTime.getHour(); // 结果:13
int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13
//获取分
int minute = localTime.getMinute(); // 结果:51
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51
//获取秒
int second = localTime.getSecond(); // 结果:10
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10
// 获取当前日期时间
LocalDateTime localDateTime = LocalDateTime.now();
// 获取LocalDate
LocalDate localDate2 = localDateTime.toLocalDate();
// 获取LocalTime
LocalTime localTime2 = localDateTime.toLocalTime();
LocalDate、LocalTime、LocalDateTime为不可变对象,修改这些对象对象会返回一个副本。增加、减少年数、月数、天数等 以LocalDateTime为例。
//增加一年
localDateTime = localDateTime.plusYears(1); //结果: 2020-09-10 14:46:56
localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //结果: 2021-09-10 14:46:56
//减少一个月
localDateTime = localDateTime.minusMonths(1); //结果: 2021-08-10 14:46:56
localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS); //结果: 2021-07-10 14:46:56
//减少一天
LocalDateTime localDateTime=date2LocalDateTime(new Date());
localDateTime = localDateTime.minus(1, ChronoUnit.DAYS);
日期计算。比如有些时候想知道这个月的最后一天是几号、下个周末是几号,通过提供的时间和日期API可以很快得到答案 。TemporalAdjusters提供的各种日期时间格式化的静态类,比如firstDayOfYear是当前日期所属年的第一天
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = localDate.with(TemporalAdjusters.firstDayOfYear());