1. 簡(jiǎn)介
Java8的時(shí)間類(lèi)有兩個(gè)重要的特性
- 線程安全
- 不可變類(lèi)鼓黔,返回的都是新的對(duì)象
顯然旭旭,該特性解決了原來(lái)java.util.Date類(lèi)與SimpleDateFormat線程不安全的問(wèn)題谎脯。同時(shí)Java8的時(shí)間類(lèi)提供了諸多內(nèi)置方法,方便了開(kāi)發(fā)者對(duì)時(shí)間進(jìn)行相應(yīng)的操作持寄。
上圖為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