1. 程式人生 > 其它 >Java8---新的日期和時間API

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);

  

。。。。