Java 之 JDK 1.8 新增日期時間類型


一、原來的日期時間

  Java1.0中包含了一個Date類,但是它的大多數方法已經在Java 1.1引入Calendar類之后被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:

  ① 可變性:象日期和時間這樣的類對象應該是不可變的。Calendar類中可以使用三種方法更改日歷字段:set()、add() 和 roll()。

  ② 偏移性:Date中的年份是從1900開始的,而月份都是從0開始的。

  ③格式化:格式化只對Date有用,Calendar則不行。

  ④此外,它們也不是線程安全的,不能處理閏秒等。

二、新增日期時間類型

  java 8中引入的java.time API 已經糾正了過去的缺陷,將來很長一段時間內它都會為我們服務。Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。

java.time – 包含值對象的基礎包
java.time.chrono – 提供對不同的日歷系統的訪問。
java.time.format – 格式化和解析時間和日期
java.time.temporal – 包括底層框架和擴展特性
java.time.zone – 包含時區支持的類

  

  Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。新的 java.time 中包含了所有關於時鍾(Clock),本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)、時區(ZonedDateTime)和持續時間(Duration)的類。歷史悠久的 Date 類新增了 toInstant() 方法,用於把 Date 轉換成新的表示形式。這些新增的本地化時間日期 API 大大簡化了了日期時間和本地化的管理。

三、java.time 類

  1、本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)

LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存儲“生日、紀念日”等日期。
LocalTime表示一個時間,而不是日期
LocalDateTime是用來表示日期和時間的,這是一個最常用的類之一。

  

 方法名稱

描述

now() / now(ZoneId zone)

靜態方法,根據當前時間創建對象/指定時區的對象

of()

靜態方法,根據指定日期/時間創建對象

getDayOfMonth()/getDayOfYear()

獲得月份天數(1-31) /獲得年份天數(1-366)

getDayOfWeek()

獲得星期幾(返回一個 DayOfWeek 枚舉值)

getMonth()

獲得月份, 返回一個 Month 枚舉值

getMonthValue() / getYear()

獲得月份(1-12) /獲得年份

getHours()/getMinute()/getSecond()

獲得當前對象對應的小時、分鍾、秒

withDayOfMonth()/withDayOfYear()/withMonth()/withYear()

將月份天數、年份天數、月份、年份修改為指定的值並返回新的對象

 with(TemporalAdjuster  t)

將當前日期時間設置為校對器指定的日期時間

plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()

向當前對象添加幾天、幾周、幾個月、幾年、幾小時

minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()

從當前對象減去幾月、幾周、幾天、幾年、幾小時

plus(TemporalAmount t)/minus(TemporalAmount t)

添加或減少一個 Duration 或 Period

isBefore()/isAfter()

比較兩個 LocalDate

isLeapYear()

判斷是否是閏年(在LocalDate類中聲明)

 format(DateTimeFormatter  t)

格式化本地日期、時間,返回一個字符串

 parse(Charsequence text)

將指定格式的字符串解析為日期、時間

  2、帶時區的日期、時間的處理

    ZonedDateTime:一個在ISO-8601日歷系統時區的日期時間,如 2007-12-03T10:15:30+01:00 Europe/Paris。

      其中每個時區都對應着ID,地區ID都為“{區域}/{城市}”的格式,例如:Asia/Shanghai等

now():使用系統時間獲取當前的ZonedDateTime
now(ZoneId):返回指定時區的ZonedDateTime

    

    ZoneId:該類中包含了所有的時區信息,一個時區的ID,如 Europe/Paris

getAvailableZoneIds():靜態方法,可以獲取所有時區信息
of(String id):靜態方法,用指定的時區信息獲取ZoneId對象

    

     Clock:使用時區提供對當前即時、日期和時間的訪問的時鍾

    Demo:

 1 public static void main(String[] args) {  2         Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();  3         for (String string : availableZoneIds) {  4  System.out.println(string);  5  }  6         
 7         ZonedDateTime t = ZonedDateTime.now();  8  System.out.println(t);  9         
10         ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of("America/New_York")); 11  System.out.println(t1); 12 
13 // Clock clock = Clock.systemDefaultZone();
14         Clock c = Clock.system(ZoneId.of("America/New_York")); 15  System.out.println(c.getZone()); 16  System.out.println(c.instant()); 17     }

 

  3、 java.time.format.DateTimeFormatter 類

    該類提供了三種格式方法:

預定義的標准格式。如:ISO_DATE_TIME;ISO_DATE
本地化相關的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)
自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

    Demo:

 1 @Test  2     public void test12(){  3         LocalDateTime now = LocalDateTime.now();  4         
 5         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒  SSS毫秒  E 是這一年的D天");  6         String string = df.format(now);  7  System.out.println(string);  8         
 9         //預定義模式
10         DateTimeFormatter df2 = DateTimeFormatter.ISO_DATE_TIME; 11  System.out.println(df2.format(now)); 12         
13         DateTimeFormatter df3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG); 14  System.out.println(df3.format(now)); 15         
16         DateTimeFormatter df4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); 17  System.out.println(df4.format(now)); 18         
19         DateTimeFormatter df5 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); 20  System.out.println(df5.format(now)); 21     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM