1. 程式人生 > 其它 >Java8新特性-日期時間

Java8新特性-日期時間

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