中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么Java8中需要導入新的日期庫與時間庫

發布時間:2020-11-24 14:53:28 來源:億速云 閱讀:208 作者:Leah 欄目:開發技術

為什么Java8中需要導入新的日期庫與時間庫?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1、Date日期輸出可讀性較差

Date date = new Date();
System.out.println(date);

打印輸出的結果:

Sat Nov 14 11:03:41 CST 2020

2、Date日期的解析、格式化通過JDK自帶的api實現較為麻煩,通常會使用第三方的日期時間庫,比如: joda-time , commons-lang

Java8中提供了哪些日期和時間類

在java.time包中提供了很多新的類,通常主要使用到的是 LocalDate , LocalTime , LocalDateTime , ZoneId , ZoneDateTime ; 關系圖如下:

為什么Java8中需要導入新的日期庫與時間庫

LocaDate這個類本身不包含時間和時區信息,只包含了日期信息;提供了很多方法來獲取常用的值:星期幾,幾月 …

常用的靜態構造 LocaDate 方法

LocalDate.of(2020, 11, 14); //指定年月日
LocalDate.of(2020, Month.NOVEMBER, 14); //指定年月日 使用Month枚舉類
LocalDate.ofYearDay(2020, 10); //2020年第10天 => 2020-01-10
LocalDate.now(); //當前時間
System.out.println(LocalDate.now()); // 比較好的可讀性輸出 => 2020-11-14

LocaDate 常用實例方法

LocalDate now = LocalDate.of(2020, 11, 14);
System.out.println(now.getMonth()); //月份的枚舉 => NOVEMBER
System.out.println(now.getMonthValue()); //月份的數字 => 11
System.out.println(now.getDayOfMonth()); //幾號 => 14
System.out.println(now.getDayOfYear()); // 一年中的第幾天 => 319
System.out.println(now.getDayOfWeek()); // 周幾枚舉 => SATURDAY
System.out.println(now.lengthOfMonth()); //本月多少天 => 30
System.out.println(now.lengthOfYear()); //本年多少天 => 366

LocalTime只包含時間信息

LocalTime.of(12, 9, 10); //時、分、秒
LocalTime.now();
LocalTime time = LocalTime.of(12, 9, 10);
System.out.println(time.getHour());
System.out.println(time.getMinute());
System.out.println(time.getSecond());

LocalDateTime 從這個類的名字可以看出是合并了 LocalDate , LocalTime ,只包含日期和時間,不包含時區信息

構造的方式,可以直接使用靜態方法創建,也可以通過 LocalDate , LocalTime 合并

LocalDateTime.of(LocalDate.now(), LocalTime.now());
LocalDateTime.of(2020, 11, 14, 13, 10, 50);
LocalDate.now().atTime(LocalTime.now());
LocalTime.now().atDate(LocalDate.now());
LocalDateTime.now();

由于 LocalDateTime 是 LocalDate , LocalTime 的合并,所以 LocalDate , LocalTime 有的實例方法,基本在 LocalDateTime 中都可以找到

ZoneId 用來替代老版本 TimeZone , 每個 ZoneId 都有一個特定的地區標識;

ZoneId.of("Asia/Shanghai");
 ZoneId.systemDefault()

查看所有的地區標識可以進入到 ZoneId 源碼

ZoneDateTime帶有日期、時間、時區信息,是 LocalDateTime 和 ZoneId 的組合

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
ZonedDateTime.of(LocalDate.now(),LocalTime.now(),ZoneId.of("Asia/Shanghai"));

經常我們會遇到需要求兩個時間之間相差的時間, 如何實現呢?

Java8也提供給了相應的API支持, Duration 、 Period

Duration between = Duration.between(LocalTime.of(13, 0), LocalTime.of(14, 0)); 
between.getSeconds(); //返回兩個時間相差的秒數 => 3600

Duration 是通過秒和毫秒來記錄時間的長短,所以只能處理兩個 LocalTime , DateLocalTime , ZonedDateTime ; 如果傳入的是 LocalDate ,將會拋出異常

java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Seconds

 at java.time.LocalDate.until(LocalDate.java:1614)
 at java.time.Duration.between(Duration.java:475)
 at com.haixue.crm.stock.service.LocalTest.testDate(LocalTest.java:121)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
 at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
 at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

在這種情況下就可以使用 Period

Period between1 = Period.between(LocalDate.of(2020, 11, 13), LocalDate.of(2020, 11, 13));
between1.getDays(); //返回相差的天數 => 1

時間日期的更高級的操作

以為對時間日期的修改增加減少都是通過第三方依賴包操作,現在原生API已經支持

LocalDate now2 = LocalDate.of(2020, 11, 13);
System.out.println(now2.plusDays(2));  //加2天 => 2020-11-15
System.out.println(now2.plusMonths(1));  //加1月 => 2020-12-13
System.out.println(now2.plusWeeks(1));  //加一周 => 2020-11-20
System.out.println(now2.minusDays(1));  //減一天 => 2020-11-12
System.out.println(now2.minusMonths(1)); //減一月 => 2020-10-13
System.out.println(now2.minusYears(1));  //減一年 => 2019-11-13
System.out.println(now2.withYear(2021)); //修改年 => 2021-11-13

有時候我們會遇到需要取本月的最后一天、本月的第一天、調整日期到下一個周日… ;這些需求也能夠通過使用 TemporalAdjuster 很好的實現, TemporalAdjuster 能夠實現很多定制化的日期操作,Java8在 TemporalAdjusters 已經給提供了默認的很多實現。

LocalDate now3 = LocalDate.of(2020, 11, 13);
System.out.println(now3.with(TemporalAdjusters.firstDayOfYear())); // 本年的第一天 => 2020-01-01
System.out.println(now3.with(TemporalAdjusters.next(DayOfWeek.MONDAY))); //下一個周一 => 2020-11-16
System.out.println(now3.with(TemporalAdjusters.lastDayOfMonth())); // 本月的最后一天 => 2020-11-30
System.out.println(now3.with(TemporalAdjusters.lastDayOfYear())); // 本年的最后一天 => 2020-12-31

自定義 TemporalAdjuster 實現獲取當天的開始時間和當天的最后時間

LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 13, 10, 10, 10);
System.out.println(localDateTime);
System.out.println(localDateTime.with((temporal) -> 
 temporal.with(ChronoField.SECOND_OF_DAY, 0))); // 當天的凌晨 => 2020-11-13T00:00
System.out.println(localDateTime.with((temporal) ->
 temporal.with(ChronoField.SECOND_OF_DAY, temporal.range(ChronoField.SECOND_OF_DAY).getMaximum()))); // 當天的最后一刻時間 => 2020-11-13T23:59:59

解析、格式化

對日期的字符串解析和格式化的操作是常用的,首先看下不用第三方包如何簡單的實現日期解析

System.out.println(LocalDateTime.parse("2020-11-14T20:50:00")); // 輸出:2020-11-14T20:50
System.out.println(LocalDateTime.parse("2020/11/14 20:50:00",
  DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); // 輸出:2020-11-14T20:50

實現格式化同樣也簡單

LocalDate now4 = LocalDate.of(2020, 11, 13);
System.out.println(now4.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"))); //輸出:2020/11/13

LocalDateTime localDateTime2 = LocalDateTime.of(2020, 11, 13, 10, 10, 10);
System.out.println(localDateTime2.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"))); //輸出:2020/11/13 10:10:10

關于為什么Java8中需要導入新的日期庫與時間庫問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡南县| 平江县| 平泉县| 五指山市| 静安区| 松滋市| 肇庆市| 即墨市| 临汾市| 驻马店市| 海盐县| 深水埗区| 兴安县| 中宁县| 常熟市| 于田县| 香河县| 三河市| 池州市| 平南县| 电白县| 德昌县| 县级市| 开化县| 平谷区| 长寿区| 调兵山市| 沙田区| 那坡县| 宝清县| 甘泉县| 临沂市| 察雅县| 四子王旗| 凤冈县| 宣武区| 镇康县| 和田县| 涿鹿县| 抚州市| 盐边县|