1. 程式人生 > >Java8新特性時間日期庫DateTime API及示例

Java8新特性時間日期庫DateTime API及示例

Java8新特性的功能已經更新了不少篇幅了,今天重點講解時間日期庫中DateTime相關處理。同樣的,如果你現在依舊在專案中使用傳統Date、Calendar和SimpleDateFormat等API來處理日期相關操作,這篇文章你一定不要錯過。來重新整理你的知識庫吧!

背景

Java對日期、日曆及時間的處理一直以來都飽受詬病,比如java.util.Date和java.util.Calendar類易用性差,不支援時區,非執行緒安全;還有用於格式化日期的類DateFormat也是非執行緒安全的等問題。

Java8引入的新的一系列API,對時間日期的處理提供了更好的支援,清楚的定義了時間日期的一些概念,比如說,瞬時時間(Instant),持續時間(duration),日期(date),時間(time),時區(time-zone)以及時間段(Period)。

同時,借鑑了Joda庫的一些優點,比如將人和機器對時間日期的理解區分開的。

簡介

新的時間日期API核心位於java.time內,另外也在java.time.chrono,java.time.format,java.time.temporal和java.time.zone有相關的API,但使用頻次較少。

Java8常用的日期和時間類包含LocalDate、LocalTime、Instant、Duration、Period、LocalDateTime以及ZonedDateTime等。

  • LocalDate:不包含時間的日期,比如2019-10-14。可以用來儲存生日,週年紀念日,入職日期等。
  • LocalTime:與LocalDate想對照,它是不包含日期的時間。
  • LocalDateTime:包含了日期及時間,沒有偏移資訊(時區)。
  • ZonedDateTime:包含時區的完整的日期時間,偏移量是以UTC/格林威治時間為基準的。
  • Instant:時間戳,與System.currentTimeMillis()類似。
  • Duration:表示一個時間段。
  • Period:用來表示以年月日來衡量一個時間段。

另外,還有新的日期解析格式化類DateTimeFormatter。

學習最佳的途徑就是去實踐它,現在我們示例的形式來講每個知識點進行講解。

LocalDate-如何獲得日期

LocalDate類內只包含日期,不包含具體時間。只需要表示日期而不包含時間,就可以使用它。

// 只獲取日期
LocalDate today = LocalDate.now();
System.out.println(today);

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獲取日期是月份的第幾天、周的第幾天,月份的天數,是否為閏年等。看下面的程式碼是不是非常方便。

LocalDate today = LocalDate.now();
// 月份中的第幾天
int dayOfMonth = today.getDayOfMonth();
// 一週的第幾天
DayOfWeek dayOfWeek = today.getDayOfWeek();
// 月份的天數
int length = today.lengthOfMonth();
// 是否為閏年
boolean leapYear = today.isLeapYear();

上面通過now獲取LocalDate物件,也可以通過靜態方法of()或parse建立任意一個日期。再也不用像之前一樣年只能從1900年開始,月必須從0開始等。

LocalDate oneDay = LocalDate.of(2019,10,1);
System.out.println(oneDay);

LocalDate parseDay = LocalDate.parse("2019-10-01");
System.out.println(parseDay);

列印結果:2019-10-01。

LocalDate重寫了equals方法,讓日期的比較也變得簡單了。

// 定義任意日期
LocalDate oneDay = LocalDate.of(2019, 10, 1);
System.out.println(oneDay);

// 定義任意比較
LocalDate anyDay = LocalDate.of(2019, 10, 1);
System.out.println(oneDay.equals(anyDay));

同時,針對日期還可延伸出MonthDay或YearMonth類,顧名思義,只包含月天或年月。同樣適用於equals方法來比較。

另外使用before和after可以比較兩個日期前後時間。

boolean notBefore = LocalDate.parse("2019-10-01").isBefore(LocalDate.parse("2019-10-02"));
boolean isAfter = LocalDate.parse("2019-10-01").isAfter(LocalDate.parse("2019-10-02"));

對日期進行前一天後一天或前一個月的加減也變得十分方便。

LocalDate tomorrowDay = LocalDate.now().plusDays(1);
LocalDate nextMonth =  LocalDate.now().plusMonths(1);

還有,我們在實戰的時候往往要獲取某一天的開始時間和當天所在月的第一天等。

LocalDate.now().atStartOfDay();
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());

LocalTime-如何獲取時間

LocalTime和LocalDate類似,區別在於LocalDate不包含具體時間,而LocalTime包含具體時間。同樣可以使用now或of方法來獲得物件。

LocalTime localTime = LocalTime.now();

LocalTime oneTime = LocalTime.of(10,10,10);

LocalDate類似它也擁有parse、isBefore、獲取時間單元等方法,就不再贅述。

需要注意的是,LocalTime獲得的時間格式為:11:41:58.904。也就是,HH:mm:ss.nnn,這裡nnn是納秒。

還有一個在實戰中查詢日期區間時我們經常定義的“23:59:59.99”常量再也不用自己定義了。

// 23:59:59.999999999
LocalTime maxTime = LocalTime.MAX;
// 00:00
LocalTime minTime = LocalTime.MIN;

LocalDateTime-日期和時間的組合

LocalDateTime表示日期和時間組合。可以通過of()方法直接建立,也可以呼叫LocalDate的atTime()方法或LocalTime的atDate()方法將LocalDate或LocalTime合併成一個LocalDateTime。

建立時間示例:

LocalDateTime now = LocalDateTime.now();

LocalDateTime oneTime = LocalDateTime.of(2019,10,14,10,12,12);

// 拼接日期
LocalTime.now().atDate(LocalDate.now());

LocalDateTime與LocalDate和LocalTime之間可以相互轉化。其他日期增減等操作與上面的類似。

Instant-獲取時間戳

Instant用於一個時間戳,與System.currentTimeMillis()類似,但Instant可以精確到納秒(Nano-Second)。

Instant除了可以使用now()方法建立,還可以通過ofEpochSecond方法建立。

Instant now = Instant.now();

Instant.ofEpochSecond(365 * 24 * 60, 100);

其中ofEpochSecond第一個引數表示秒,第二個引數表示納秒。整體表示:從1970-01-01 00:00:00開始後的365天100納秒的時間點。

Duration-獲取時間段

Duration的內部實現與Instant類似,但Duration表示時間段,通過between方法建立。

LocalDateTime from = LocalDateTime.now();
LocalDateTime to = LocalDateTime.now().plusDays(1);
Duration duration = Duration.between(from, to);

// 區間統計換算
// 總天數
long days = duration.toDays();
// 小時數
long hours = duration.toHours();
// 分鐘數
long minutes = duration.toMinutes();
// 秒數
long seconds = duration.getSeconds();
// 毫秒數
long milliSeconds = duration.toMillis();
// 納秒數
long nanoSeconds = duration.toNanos();

Duration物件還可以通過of()方法建立,該方法引數為時間段長度和時間單位。

// 7天
Duration duration1 = Duration.of(7, ChronoUnit.DAYS);
// 60秒
Duration duration2 = Duration.of(60, ChronoUnit.SECONDS);

Period-獲取日期段

Period與Duration類似,獲取一個時間段,只不過單位為年月日,也可以通過of方法和between方法建立,between方法接收的引數為LocalDate。

Period period = Period.of(1, 10, 25);

Period period1 = Period.between(LocalDate.now(), LocalDate.now().plusYears(1));

ZonedDateTime-建立時區時間

ZonedDateTime類,用於處理帶時區的日期和時間。ZoneId表示不同的時區。大約有40不同的時區。

獲取所有時區集合:

Set allZoneIds = ZoneId.getAvailableZoneIds();

建立時區:

ZoneId zoneId = ZoneId.of("Asia/Shanghai");

把LocalDateTime轉換成特定的時區:

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);

另外和時區一起使用的類是OffsetDateTime類,OffsetDateTime是不變的,表示date-time偏移,儲存所有日期和時間欄位,精確至納秒,從UTC/Greenwich計算偏移。

時間日期格式化

Java8對日期的格式化操作非常簡單,首先看到上面的類大多都提供了parse方法,可以直接通過解析字串得到對應的物件。

而日期和時間的格式化可通過LocalDateTime的format方法進行格式化。

LocalDateTime dateTime = LocalDateTime.now();
String str = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println(str);
str = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(str);

可以使用DateTimeFormatter預置的格式,也可以通過DateTimeFormatter.ofPattern方法來指定格式。

關鍵點回顧

Java8中關於時間日期的API有以下關鍵點:

  • 提供了javax.time.ZoneId用來處理時區。
  • 提供了LocalDate與LocalTime類。
  • 時間與日期API中的所有類都是執行緒安全的。
  • 明確定義了基本的時間與日期概念。
  • 核心API:Instant、LocalDate、LocalTime、LocalDateTime、ZonedDateTime。
  • DateTimeFormatter類用於在Java中進行日期的格式化與解析。

好了,關於Java8新特性的時間日期功能就將到這裡,用起來是不是簡單明快多了,趕緊在專案中練練手吧。

原文連結:《Java8新特性時間日期庫DateTime API及示例》


程式新視界:精彩和成長都不容錯過

相關推薦

Java8特性時間日期DateTime API示例

Java8新特性的功能已經更新了不少篇幅了,今天重點講解時間日期庫中DateTime相關處理。同樣的,如果你現在依舊在專案中使用傳統Date、Calendar和SimpleDateFormat等API來處理日期相關操作,這篇文章你一定不要錯過。來重新整理你的知識庫吧! 背景 Java對日期、日曆及時間的處理一

Java8時間日期使用示例(LocalDate LocalTime )

java8引入了一套全新的時間日期API,本篇隨筆將說明學習java8的這套API。 java。time包中的是類是不可變且執行緒安全的。新的時間及日期API位於java.time中,下面是一些關鍵類 ●Instant——它代表的是時間戳 ●LocalDate——不包含具體時間的日期,比

Java8特性日期-時間API 侵立刪

轉自:cnblogs.com/liantdev/p/10108504.html 在Java8之前的版本中,我們處理時間型別常常使用的是java.util包下的Date類。 但使用Date類卻有諸多的弊端,如:java.util.Date是非執行緒安全的,所有的日期類都是可變的;日期/時間類的

java8特性日期時間

LocalDate類使用ISO日曆表示年、月、日。  常用方法:  1、LocalDate.now():獲取系統當前日期。  2、LocalDate.of(int year,int month,int dayOfMonth)     按指定日期建立LocalDate物件。  

Java8特性_日期時間類 LocalDate、LocalTime、LocalDateTime

cat except clas method stl smo available all etsec import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.f

Java8 特性(三) - 日期時間物件以及一些其他特性

日期時間物件 關於日期時間的操作可以分為兩種: 轉換:與字串的互相轉換,與時間戳的互相轉換 計算:計算兩個時間點之間的間隔、時間點與時間段的計算(計算下週N、下個月D日、去年M月D日等等) Java8 提供了三個類:LocalDate、LocalTime、LocalDateTime,它們的形式如 2020

Java 8時間日期的20個使用示例

原文連結 作者:Javin Paul 譯者:之諸暇 除了lambda表示式,stream以及幾個小的改進之外,Java 8還引入了一套全新的時間日期API,在本篇教程中我們將通過幾個簡單的任務示例來學習如何使用Java 8的這套API。 Java對日期,日曆及時間的處理一直以來都飽受詬病,尤

2020了你還不會Java8特性?方法引用詳解Stream 流介紹和操作方式詳解(三)

方法引用詳解 方法引用: method reference 方法引用實際上是Lambda表示式的一種語法糖 我們可以將方法引用看作是一個「函式指標」,function pointer 方法引用共分為4類: 類名::靜態方法名 引用名(物件名)::例項方法名 類名::例項方法名 (比較不好理解,個地方呼叫的方

Java8特性之:日期時間API

java8 時間日期API 一. LocalDate、LocalTime、Instant、Duration以及Period 1.LocalDate只提供日期,不含當天時間信息LocalDate date = LocalDate.of(2018, 5, 03); int year = da

Java8特性(五)日期時間API

1、新時間日期API java.time – 包含值物件的基礎包 java.time.chrono – 提供對不同的日曆系統的訪問 java.time.format – 格式化和解析時間和日期 java.time.temporal – 包括底層框架和擴

Java8特性】關於Java8中的日期時間API,你需要掌握這些!!

## 寫在前面 > Java8之前的日期和時間API,存在一些問題,比如:執行緒安全的問題,跨年的問題等等。這些問題都在Hava8中的日期和時間API中得到了解決,而且Java8中的日期和時間API更加強大。立志成為架構師的你,必須掌握Java8中的日期和時間API。 ## 本地時間和時間戳 **

Java8特性探索之日期時間

一、為什麼引入新的日期時間庫 Java對日期,日曆及時間的處理一直以來都飽受詬病,尤其是它決定將java.util.Date定義為可修改的以及將SimpleDateFormat實現成非執行緒安全的。 關於這個新的時間日期庫的最大的優點就在於它定義清楚了時間日期相關的一些概念,比方說,瞬時時間(Instant)

Java8特性——一套時間API的使用

公開 訪問 定義 簡化 override toe sta call() stat JDK 1.0中包含了一個java.util.Date類,但是它的大多數方法已經在JDK 1.1引入Calendar類之後被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:

為什麼不建議使用Date,而是使用Java8時間日期API

Java 8:新的時間和日期API 在Java 8之前,所有關於時間和日期的API都存在各種使用方面的缺陷,因此建議使用新的時間和日期API,分別從舊的時間和日期的API的缺點以及解決方法、Java 8 新的時間和日期API進行講解。 舊的時間和日期的API的缺陷 Java 的 java.util.Date

JAVA8時間日期 API】- 傳統時間格式化的執行緒安全問題

Java8之前的日期和時間API,存在一些問題,最重要的就是執行緒安全的問題。這些問題都在Java8中的日期和時間API中得到了解決,而且Java8中的日期和時間API更加強大。 傳統時間格式化的執行緒安全問題 示例: import java.text.SimpleDateFormat; import

Java精品高級課,架構課,java8特性,P2P金融項目,程序設計,功能設計,數據設計,第三方支付,web安全,視頻教程

數據庫設計 zfs 調優 pex 完整版 city 後臺 中間件 集群 36套精品Java架構師,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰,P2P金融項目,大型分布式電商實戰視頻教程 視頻課程包含: 高級Java架構師包含:Sp

36套精品Java高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項目實戰,大型分布式電商項目實戰視頻教程

java cti 投資 調優 dubbo pac 性能 -s clas 36套精品Java高級課,架構課,java8新特性,P2P金融項目,程序設計,功能設計,數據庫設計,第三方支付,web安全,高並發,高性能,高可用,分布式,集群,電商,緩存,性能調優,設計模式,項

Java8特性-官方特性

identity nis brush else reat 均值 emp lba long 一、Optional Java應用中最常見的bug就是空值異常。在Java 8之前,Google Guava引入了Optionals類來解決NullPointerExceptio

JAVA8特性之 Stream API

重要的 Stream API  : java.util.Stream.* Stream提供了一種高效且簡易處理資料的方式 注意:1.Stream自己不會儲存元素            2.對Stream進行操作不會改變資料來源,相反,

java8特性之-----日期格式化的執行緒安全問題

SimpleDateFormat是執行緒非安全的。那麼在多執行緒中,就會出現錯誤的結果如下程式碼: public static void main(String[] args){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyM