Java8新特性-日期時間
阿新 • • 發佈:2021-10-27
1.背景
Java 8通過釋出新的Date-Time API (JSR 310)來進一步加強對日期與時間的處理。
在舊版的 Java 中,日期時間 API 存在諸多問題,其中有:
非執行緒安全 − java.util.Date 是非執行緒安全的,所有的日期類都是可變的,這是Java日期類最大的問題之一。
設計不規範 − Java的日期/時間類的定義並不一致,在java.util和java.sql的包中都有日期類,此外用於格式化和解析的類在java.text包中定義。java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其納入java.sql包並不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。
時區處理麻煩 − 日期類並不提供國際化,沒有時區支援,因此Java引入了java.util.Calendar和java.util.TimeZone類,但他們同樣存在上述所有的問題。
2.Java8中java.time包下的類
如上圖所示,在java8中,java.time包下主要包含下面幾個主要的類:
Instant:時間戳 Duration:持續時間,時間差 LocalDate:只包含日期,比如:2016-10-20 LocalTime:只包含時間,比如:23:12:10 LocalDateTime:包含日期和時間,比如:2016-10-20 23:14:21 Period:時間段 ZoneOffset:時區偏移量,比如:+8:00 ZonedDateTime:帶時區的時間 Clock:時鐘,比如獲取目前美國紐約的時間
新的java.time包涵蓋了所有處理日期,時間,日期/時間,時區,時刻(instants),過程(during)與時鐘(clock)的操作。
LocalTime 和 LocalDate的區別?
LocalTime表⽰時間,時分秒,LocalDate表⽰⽇期,年⽉⽇。
獲取當前時間,在Java8中,使用如下方式獲取當前時間:
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("Year : %d Month : %d day : %d t %n", year,month, day);
建立指定日期的時間
LocalDate date = LocalDate.of(2021, 01, 01);
檢查閏年,直接使⽤LocalDate的isLeapYear即可判斷是否閏年
LocalDate nowDate = LocalDate.now();
//判斷閏年
boolean leapYear = nowDate.isLeapYear();
計算兩個⽇期之間的天數和⽉數
在Java 8中可以⽤java.time.Period類來做計算。
Period period = Period.between(LocalDate.of(2021, 1, 5),LocalDate.of(2021, 2, 5));
以及java.time.format包中的
DateTimeFormatter:時間格式化
時間格式化成指定格式的字串:
LocalDateTime timeNow = LocalDateTime.now(); System.out.println("before formatter:" + timeNow); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); String afterFormat = dateTimeFormatter.format(timeNow); System.out.println("after formatter:" + afterFormat);
輸出:
before formatter:2021-10-27T11:49:37.407
after formatter:2021-10-27 11:49:37
字串格式化成時間型別:
String timeFormat = "2021-10-27 11:49:37"; //HH表示24小時制,hh表示12小時制 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime localDate = LocalDateTime.parse(timeFormat, formatter); System.out.println(localDate);
輸出:
2021-10-27T11:49:37
3.比較java.util.date
時間格式化成指定格式的字串:
//1.將Date型別轉化成對應格式的字串,SimpleDateFormat始終都要建立的 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String oldDate = sdf.format(date); System.out.println(oldDate);
輸出:
2021-10-27 11:57:31
將字串轉化成指定格式的時間:
//2.將字串轉化成指定格式的時間,SimpleDateFormat始終都要建立的 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = sdf.parse("2021-10-27 11:57:31"); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); }
輸出:
Wed Oct 27 11:57:31 CST 2021