致力于最高效的Java学习
Java8 之前,对于日期和时间的操作主要是通过 Date 来完成的,但是 Date 类的设计存在诸多不足。
例如 java.util 和 java.sql 中都定义了同名的 Date 类,但是使用起来却并不匹配,java.util.Date 包含日期和时间,但是 java.sql.Date 没有时间,只包含日期。
另外 java.util.Date 的月是从 0 开始计算的,比如 7 月对应的值就是 6,但是日期又是从 1 开始计算的,使用起来很不方便,同时对日期进行格式化操作的 SimpleDateFormat 类又定义在 java.text 包中。
日期类不支持时区,所以 Java 引入了 java.util.Calendar 来管理相关功能,但是使用起来仍存在问题。
日期类除了操作不便、不支持时区,最大的问题在于所有的日期类都是非线程安全的,可以随意更改。
综上所述,开发者急需一个全新的 API 来替代旧版的日期类,Java8 解决了这一问题,全新的 java.time API 解决了旧版 API 中的许多问题,今天我们就来详细学习 Java8 日期 API 的使用。
首先是解决时区问题的 Local,具体有两个类 LocalDate 和 LocalDateTime。
LocalDate 类只包括日期,常用方法如下所示。
具体操作如下所示。
public class LocalDateTest {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
System.out.println("now方法:"+localDate);
localDate = LocalDate.of(2019,1,1);
System.out.println("of方法:"+localDate);
localDate = LocalDate.ofYearDay(2019,33);
System.out.println("ofYearDay方法:"+localDate);
localDate = LocalDate.parse("2019-06-22");
System.out.println("parse方法:"+localDate);
System.out.println("getYear方法:"+localDate.getYear());
System.out.println("getMonthValue方法:"+localDate.getMonthValue());
System.out.println("getDayOfMonth方法:"+localDate.getDayOfMonth());
System.out.println("getDayOfYear方法:"+localDate.getDayOfYear());
System.out.println("getDayOfWeek方法:"+localDate.getDayOfWeek());
System.out.println("isLeapYear方法:"+localDate.isLeapYear());
System.out.println("lengthOfMonth方法:"+localDate.lengthOfMonth());
System.out.println("lengthOfYear方法:"+localDate.lengthOfYear());
System.out.println("withYear方法:"+localDate.withYear(2016));
System.out.println("withMonth方法:"+localDate.withMonth(1));
System.out.println("withDayOfMonth方法:"+localDate.withDayOfMonth(11));
System.out.println("withDayOfYear方法:"+localDate.withDayOfYear(360));
System.out.println("plusYears方法:"+localDate.plusYears(3));
System.out.println("plusMonths方法:"+localDate.plusMonths(3));
System.out.println("plusWeeks方法:"+localDate.plusWeeks(2));
System.out.println("plusDays方法:"+localDate.plusDays(20));
System.out.println("minusYears方法:"+localDate.minusYears(3));
System.out.println("minusMonths方法:"+localDate.minusMonths(3));
System.out.println("minusWeeks方法:"+localDate.minusWeeks(2));
System.out.println("minusDays方法:"+localDate.minusDays(20));
LocalDate localDate1 = LocalDate.of(2018,1,1);
System.out.println("isAfter方法:"+localDate.isAfter(localDate1));
System.out.println("isBefore方法:"+localDate.isBefore(localDate1));
}
}
运行结果如下图所示。
LocalDateTime 类只包括时间,常用方法如下所示。
具体操作如下所示。
public class LocalDateTimeTest {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("localDateTime方法:"+localDateTime);
localDateTime = LocalDateTime.of(2019,6,22,10,10,10);
System.out.println("of方法:"+localDateTime);
localDateTime = LocalDateTime.parse("2019-06-22T10:10:10");
System.out.println("parse方法:"+localDateTime);
LocalDate localDate = localDateTime.toLocalDate();
System.out.println("localDate方法:"+localDate);
System.out.println("getYear方法:"+localDateTime.getYear());
System.out.println("getMonthValue方法:"+localDateTime.getMonthValue());
System.out.println("getDayOfMonth方法:"+localDateTime.getDayOfMonth());
System.out.println("getDayOfYear方法:"+localDateTime.getDayOfYear());
System.out.println("getDayOfWeek方法:"+localDateTime.getDayOfWeek());
System.out.println("getHour方法:"+localDateTime.getHour());
System.out.println("getMinute方法:"+localDateTime.getMinute());
System.out.println("getSecond方法:"+localDateTime.getSecond());
System.out.println("getNano方法:"+localDateTime.getNano());
System.out.println("withYear方法:"+localDateTime.withYear(2016));
System.out.println("withMonth方法:"+localDateTime.withMonth(1));
System.out.println("withDayOfMonth方法:"+localDateTime.withDayOfMonth(11));
System.out.println("withDayOfYear方法:"+localDateTime.withDayOfYear(360));
System.out.println("withHour方法:"+localDateTime.withHour(22));
System.out.println("withMinute方法:"+localDateTime.withMinute(15));
System.out.println("withSecond方法:"+localDateTime.withSecond(23));
System.out.println("withNano方法:"+localDateTime.withNano(360));
System.out.println("plusYears方法:"+localDateTime.plusYears(3));
System.out.println("plusMonths方法:"+localDateTime.plusMonths(3));
System.out.println("plusWeeks方法:"+localDateTime.plusWeeks(2));
System.out.println("plusDays方法:"+localDateTime.plusDays(20));
System.out.println("plusHours方法:"+localDateTime.plusHours(22));
System.out.println("plusMinutes方法:"+localDateTime.plusMinutes(15));
System.out.println("plusSeconds方法:"+localDateTime.plusSeconds(23));
System.out.println("plusNanos方法:"+localDateTime.plusNanos(360));
System.out.println("minusYears方法:"+localDateTime.minusYears(3));
System.out.println("minusMonths方法:"+localDateTime.minusMonths(3));
System.out.println("minusWeeks方法:"+localDateTime.minusWeeks(2));
System.out.println("minusDays方法:"+localDateTime.minusDays(20));
System.out.println("minusHours方法:"+localDateTime.minusHours(22));
System.out.println("minusMinutes方法:"+localDateTime.minusMinutes(15));
System.out.println("minusSeconds方法:"+localDateTime.minusSeconds(23));
System.out.println("minusNanos方法:"+localDateTime.minusNanos(360));
LocalDateTime localDateTime1 = LocalDateTime.of(2018,1,1,10,10,10);
System.out.println("isAfter方法:"+localDateTime.isAfter(localDateTime1));
System.out.println("isBefore方法:"+localDateTime.isBefore(localDateTime1));
}
}
运行结果如下图所示。
LocalDate 和 LocalDateTime 都不带时区,如果要添加时区进行操作,可以使用 ZonedDateTime。
ZonedDateTime 类以某个时区来创建日期时间对象,不能修改,时间精度为纳秒,ZonedDateTime 中的常用方法与 LocalDateTime 一致,区别在于 LocalDateTime 不需要时区,ZonedDateTime 多了一个时区,具体操作如下所示。
public class ZonedDateTimeTest {
public static void main(String[] args) {
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当前时区: " + currentZone);
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前时间:"+zonedDateTime);
zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Rome"));
System.out.println("罗马时间:"+zonedDateTime);
System.out.println("getYear方法:"+zonedDateTime.getYear());
System.out.println("getMonthValue方法:"+zonedDateTime.getMonthValue());
System.out.println("getDayOfMonth方法:"+zonedDateTime.getDayOfMonth());
System.out.println("getDayOfYear方法:"+zonedDateTime.getDayOfYear());
System.out.println("getDayOfWeek方法:"+zonedDateTime.getDayOfWeek());
System.out.println("getHour方法:"+zonedDateTime.getHour());
System.out.println("getMinute方法:"+zonedDateTime.getMinute());
System.out.println("getSecond方法:"+zonedDateTime.getSecond());
System.out.println("getNano方法:"+zonedDateTime.getNano());
System.out.println("withYear方法:"+zonedDateTime.withYear(2016));
System.out.println("withMonth方法:"+zonedDateTime.withMonth(1));
System.out.println("withDayOfMonth方法:"+zonedDateTime.withDayOfMonth(11));
System.out.println("withDayOfYear方法:"+zonedDateTime.withDayOfYear(360));
System.out.println("withHour方法:"+zonedDateTime.withHour(22));
System.out.println("withMinute方法:"+zonedDateTime.withMinute(15));
System.out.println("withSecond方法:"+zonedDateTime.withSecond(23));
System.out.println("withNano方法:"+zonedDateTime.withNano(360));
System.out.println("plusYears方法:"+zonedDateTime.plusYears(3));
System.out.println("plusMonths方法:"+zonedDateTime.plusMonths(3));
System.out.println("plusWeeks方法:"+zonedDateTime.plusWeeks(2));
System.out.println("plusDays方法:"+zonedDateTime.plusDays(20));
System.out.println("plusHours方法:"+zonedDateTime.plusHours(22));
System.out.println("plusMinutes方法:"+zonedDateTime.plusMinutes(15));
System.out.println("plusSeconds方法:"+zonedDateTime.plusSeconds(23));
System.out.println("plusNanos方法:"+zonedDateTime.plusNanos(360));
System.out.println("minusYears方法:"+zonedDateTime.minusYears(3));
System.out.println("minusMonths方法:"+zonedDateTime.minusMonths(3));
System.out.println("minusWeeks方法:"+zonedDateTime.minusWeeks(2));
System.out.println("minusDays方法:"+zonedDateTime.minusDays(20));
System.out.println("minusHours方法:"+zonedDateTime.minusHours(22));
System.out.println("minusMinutes方法:"+zonedDateTime.minusMinutes(15));
System.out.println("minusSeconds方法:"+zonedDateTime.minusSeconds(23));
System.out.println("minusNanos方法:"+zonedDateTime.minusNanos(360));
}
}
运行结果如下图所示。
往期文章一览