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)); } }
运行结果如下图所示。
关注微信公众号「Java大联盟」,关注即可获取海量学习干货,同时还有不定期送书,键盘,鼠标等粉丝福利。
本文暂时没有评论,来添加一个吧(●'◡'●)