Java8 日期類(lèi)相關(guān)介紹

1. 簡(jiǎn)介

Java8的時(shí)間類(lèi)有兩個(gè)重要的特性

  • 線(xiàn)程安全
  • 不可變類(lèi),返回的都是新的對(duì)象

顯然,該特性解決了原來(lái)java.util.Date類(lèi)與SimpleDateFormat線(xiàn)程不安全的問(wèn)題。同時(shí)Java8的時(shí)間類(lèi)提供了諸多內(nèi)置方法,方便了開(kāi)發(fā)者對(duì)時(shí)間進(jìn)行相應(yīng)的操作。

Java8時(shí)間相關(guān)類(lèi).png

上圖為Java8相關(guān)的時(shí)間類(lèi)及時(shí)間范圍,具體類(lèi)如下。

  • LocalDate
  • LocalTime
  • LocalDateTime
  • ZoneId
  • ZonedDateTime
  • Instant

2. 時(shí)間相關(guān)類(lèi)

2.1 Instant類(lèi)

Instant類(lèi)用來(lái)表示格林威治時(shí)間(UTC)開(kāi)始的時(shí)間點(diǎn),初始時(shí)間為1970-01-01T00:00:00Z。也就是從1970年一月一號(hào)開(kāi)始計(jì)時(shí),得到的秒值甚至是是納秒值。該時(shí)間戳可以與日期時(shí)間轉(zhuǎn)換。因此可以表示人類(lèi)世界最完整的時(shí)間。該類(lèi)相比原來(lái)java.util.Date類(lèi),精確到了納秒級(jí)別。

獲取當(dāng)前的秒值和納秒值

// Java代碼如下
Instant instant = Instant.now();
System.out.println(instant);
System.out.println(instant.getEpochSecond());
System.out.println(instant.getNano());

結(jié)果如下
2019-08-28T07:59:54.979Z
1566979194
979000000

將指定秒值轉(zhuǎn)為Instant。Instant.ofEpochSecond()方法。

Instant instant1 = Instant.ofEpochSecond(1566981233L);
System.out.println(instant1);

2.2 LocalDate、LocalTime、LocalDateTime、ZonedDateTime

  • Java8使用LocalDate、LocalTime、LocalDateTime、ZonedDateTime分別操作日期、時(shí)間、日期和時(shí)間。
  • 這四個(gè)類(lèi)的默認(rèn)使用系統(tǒng)時(shí)區(qū)

獲取當(dāng)天日期及時(shí)間

// Java相關(guān)代碼如下
LocalDate today = LocalDate.now();
System.out.println(today);

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);

LocalTime localTime = LocalTime.now();
System.out.println(localTime);

ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);

ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId);

結(jié)果如下

2019-08-28
2019-08-28T17:42:01.964
17:42:01.965
2019-08-28T17:42:01.965+08:00[Asia/Shanghai]
Asia/Shanghai

指定日期2019-09-30并通過(guò)isBefore()判斷是否今天在指定日期之前

LocalDate future = LocalDate.of(2019, 9, 30);
boolean before = today.isBefore(future);
System.out.println(before);

LocalDateTime轉(zhuǎn)String 通過(guò)DateTimeFormatter指定轉(zhuǎn)換格式

String formatStr = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
System.out.println(formatStr);

String轉(zhuǎn)為L(zhǎng)ocalDate

String str = "2019-01-02";
LocalDate localDate2 = LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(localDate2);

2.3 LocalDateTime與Instant的互相轉(zhuǎn)換

獲取當(dāng)天的秒值和毫秒值。LocalDateTime轉(zhuǎn)Instant獲取時(shí)間戳。由于LocalDateTime并沒(méi)有包含時(shí)區(qū),轉(zhuǎn)為Instant需要指明所在時(shí)區(qū)。北京時(shí)間也就是東八區(qū)ZoneOffset.of("+8")

long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
System.out.println(milliSecond);

long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
System.out.println(second);

Instant時(shí)間戳轉(zhuǎn)LocalDateTime。使用LocalDateTime.ofInstant方法,需要指定轉(zhuǎn)換為哪個(gè)時(shí)區(qū)的時(shí)間

LocalDateTime localDateTime2 = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); //使用系統(tǒng)默認(rèn)時(shí)間
System.out.println(localDateTime2);

結(jié)果如下
2019-08-28T16:33:53.639

3. 參考文章

https://blog.csdn.net/u013066244/article/details/96443952

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容