這篇文章主要是java8中新的Date和Time API的實戰。新的Date和Time類是Java開發者社區千呼萬喚始出來的。Java8 以前存在的Date類一直都受人詬病,不少人都會選擇使用第三方的date庫joda-time。Java8中的date和time api是jodatime的做者參與開發的,實現了JSR310的所有內容。這些新的api都在包java.time下。
既然第三方的joda-time,date4j都已經足夠強大了,爲何java8還要從新實現他呢,一部分的緣由是這些第三方的庫是存在兼容問題的,好比標準的JSF日期轉化器與joda-time api,就不兼容,每次使用都須要編寫本身的轉換器,因此標準化api是必須的,就有了JSR310,java8中就實現了他所有的規定內容。
新Date類和Time類背後的設計原則:
不可變類
java8以前,Date類都是可變類。當咱們在多線程環境下使用它,編程人員應該確認Date對象的線程安全。Java8的Date和Time API提供了線程安全的不可變類。編程人員不用考慮併發的問題。
領域模型驅動設計方法
新的日期和時間的類別遵循「域驅動設計」。對於開發者來講,理解方法和類的功能是很容易的。
java.time.LocalDate:
LocalDate只提供日期不提供時間信息。它是不可變類且線程安全的。
java.time.LocalTime:
LocalTime只提供時間而不提供日期信息,它是不可變類且線程安全的。
java.time.LocalDateTime:
LocalDateTime提供時間和日期的信息,它是不可變類且線程安全的
java.time.Year:
Year提供年的信息,它是不可變類且線程安全的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.time.Year;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
//Get year
Year year = Year.now();
System.out.println( "Year ::" + year);
//know the year is leap year or not
System.out.println( "Is year[" +year+ "] leap year?" + year.isLeap());
}
}
|
運行結果:
java.time.Duration:
Duration是用來計算兩個給定的日期之間包含多少秒,多少毫秒,它是不可變類且線程安全的
java.time.Period:
Period是用來計算兩個給定的日期之間包含多少天,多少月或者多少年,它是不可變類且線程安全的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
Period period = Period.between(localDate, localDate.plus( 2 , ChronoUnit.DAYS));
System.out.println(period.getDays());
}
}
|
運行結果: