Java 8的Time包常用API
Date、Canlender、SimpleDateFormat类在新的Time包面前几乎没有优势
日期LocalDate,时间LocalTime,日期时间LocalDateTime。
时区ZoneId,时间点Instant,时间单位ChronoUnit,格式化DateTimeFormatter
LocalDate
当前日期
LocalDate localDate = LocalDate.now();
指定日期
// (方式1) LocalDate localDate1 = LocalDate.of(2017, 07, 20); // (方式2) LocalDate localDate2 = LocalDate.parse("2017-07-25");
日期加/减 多少个时间单位
// 加1个月(方式1) LocalDate localDate = localDate.plus(1, ChronoUnit.MONTHS); // 加1天(方式2) LocalDate localDate = localDate.plusDays(1);
解析日期
int dayOfMonth = localDate.getDayOfMonth();
是否闰年
boolean b = localDate.isLeapYear();
是否是一个日期之前/之后
boolean b = localDate1.isBefore(localDate2); boolean b = localDate1.isAfter(localDate2);
两个日期相差多少个时间单位
// 相差多少天
long diff = ChronoUnit.DAYS.between(localDate1, localDate2); // 相差多少秒
long diff = ChronoUnit.SECONDS.between(localDate1, localDate2);
格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String s = dateTimeFormatter.format(localDate);
两个日期是否相等
boolean b = localDate1.equals(localDate2);
LocalTime
大部分的API与LocalDate同理,区别之处在于
1、无法判断是否闰年
2、LocalDate对象toString()返回的是“2017-11-09”,LocalTime对象toString()返回的是“11:16:50.144”(如果毫秒数为0,则最后一段数字不显示),如果想要返回HH:mm:ss格式,需要格式化。
LocalDateTime
大部分的API与LocalDate同理,区别之处在于
1、无法直接判断是否闰年,需要先转化为LocalDate
boolean b = localDateTime.toLocalDate().isLeapYear();
2、LocalDateTime对象toString()返回的是“2017-11-09T11:16:50.144”,如果想要返回HH:mm:ss格式,需要格式化。
处理遗留代码中的java.util.Date对象
先将Date转化为Instant对象,然后根据需要用LocalDate、LocalTime、LocalDateTime各自的from工厂方法生成对象
// 遗留代码 Date birthday = user.getBirthday(); Date orderTime = order.getOrderTime(); // 转换 LocalDate birthdayEx = LocalDate.from(birthday.toInstant()); LocalDateTime orderTimeEx = LocalDateTime.from(orderTime.toInstant());
处理遗留代码中的java.util.Calendar对象
与java.util.Date对象的转化同理,Calendar对象也有toInstant方法。