日期处理一直是JDK之前版本的一个诟病,所以我们平时开发的时候会选择用其他的工具包例如joda-time来代替JDK自带的日期处理方式处理日期的相关问题。这次Java的设计者终于正视了这个问题,吸取了joda-time的精华,来优化之前的日期处理的繁琐,让我们在处理时间的时候更加方便。
下面我们来看看Java8是怎样计算日期的。
===============Java8之前==========
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
public static void main(String[] args) {
Date currentDate = new Date();
System.out.println(dateFormat.format(currentDate));
Calendar c = Calendar.getInstance();
c.setTime(currentDate);//将Date转换成Calendar
//操作日期
c.add(Calendar.YEAR, 1);
c.add(Calendar.MONTH, 1);
c.add(Calendar.DATE, 1); //和 c.add(Calendar.DAY_OF_MONTH, 1);效果是一样的
c.add(Calendar.HOUR, 1);
c.add(Calendar.MINUTE, 1);
c.add(Calendar.SECOND, 1);
Date currentDatePlusOne = c.getTime();//将Calendar转换成Date
System.out.println(dateFormat.format(currentDatePlusOne));
}
输出:
2017/04/24 10:24:00
2018/05/25 11:25:01
===============Java8==========
private static final String DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
private static final DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
private static final DateTimeFormatter dateFormat8 = DateTimeFormatter.ofPattern(DATE_FORMAT);
public static void main(String[] args) {
Date currentDate = new Date();
System.out.println("date : " + dateFormat.format(currentDate));
// 将date转换成 localdatetime
LocalDateTime localDateTime = currentDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("localDateTime : " + dateFormat8.format(localDateTime));
// 操作日期
localDateTime = localDateTime.plusYears(1).plusMonths(1).plusDays(1);
localDateTime = localDateTime.plusHours(1).plusMinutes(2).minusMinutes(1).plusSeconds(1);
// 将LocalDateTime转换成date
Date currentDatePlusOneDay = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("Output : " + dateFormat.format(currentDatePlusOneDay));
}
输出:
date : 2017/04/24 10:24:24
localDateTime : 2017/04/24 10:24:24
Output : 2018/05/25 11:25:25
个人觉得这样处理时间的话,确实要比之前的处理方式舒服不少。