Java8---新的日期和時間API
Java8以前時間和日期api存在的問題:
在Java 1.0 中,對日期和時間的支援只能依賴java.util.Date 類,這個類無法表示日期,只能以毫秒的精度表示時間。
比如:年份的起始選擇是1900 年,月份的起始從0 開始。這意味著,如果你想要用Date 表示Java 9 的釋出日期,即2017 年9 月21 日,
需要建立下面這樣的Date 例項:
Date date = new Date(117, 8, 21);
它的列印輸出效果為:
Thu Sep 21 00:00:00 CET 2017
在Java 1.1 中,Date 類中的很多方法被廢棄了,取而代之的是java.util.Calendar 類,Calendar 類也有類似的問題和設計缺陷月份依舊是從0 開始計算
(不過,至少Calendar 類去掉了由1900 年開始計算年份這一設計)
有的特性只在某一個類中提供,比如用於以語言無關方式格式化和解析日期或時間的DateFormat 方法就只在Date 類裡有。
使用LocalDate 和LocalTime
LocalDate 類的例項是一個不可變物件,它只提供了簡單的日期,並不含當天的時間資訊。另外,它也不附帶任何與時區相關的資訊。
LocalDate date = LocalDate.of(2017, 9, 21);//2017-09-21 int year = date.getYear(); //2017 Month month = date.getMonth(); //SEPTEMBER int day = date.getDayOfMonth(); //21 DayOfWeek dow = date.getDayOfWeek(); //THURSDAY int len = date.lengthOfMonth(); //30 boolean leap = date.isLeapYear(); //false
可以使用工廠方法now 從系統時鐘中獲取當前的日期:
LocalDate today = LocalDate.now();
而LocalTime是一個不可變的物件,表示一個沒有日期資訊的時間。
LocalTime time = LocalTime.of(13, 45, 20); int hour = time.getHour(); int minute = time.getMinute(); int second = time.getSecond();
LocalDate 和LocalTime 都可以通過解析代表它們的字串建立。使用靜態方法parse:
LocalDate date = LocalDate.parse("2017-09-21"); LocalTime time = LocalTime.parse("13:45:20");
一旦傳遞的字串引數無法被解析為合法的LocalDate 或LocalTime 物件,這兩個parse 方法都會丟擲一個繼承自RuntimeException 的DateTimeParseException 異常。
使用複合類LocalDateTime
LocalDateTime,是LocalDate 和LocalTime 的合體。它同時表示了日期和時間,但不帶有時區資訊,可以直接建立,也可以通過合併日期和時間物件建立
LocalDateTime dt1 = LocalDateTime.of(2014, Month.SEPTEMBER, 21, 13, 45, 20); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(13, 45, 20); LocalDateTime dt4 = date.atTime(time); LocalDateTime dt5 = time.atDate(date); LocalDate date1 = dt1.toLocalDate(); LocalTime time1 = dt1.toLocalTime();
操縱、解析和格式化日期
withAttribute 方法會建立物件的一個副本,並按照需要修改它的屬性,它們都不會修改原來的物件!
LocalDate date1 = LocalDate.of(2017, 9, 21); LocalDate date2 = date1.withYear(2011); LocalDate date3 = date2.withDayOfMonth(25); LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 2);
。。。。