<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java 8 – 日期和時間示例 > 原文: [https://howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/](https://howtodoinjava.com/java8/date-and-time-api-changes-in-java-8-lambda/) 開發人員社區的很大一部分一直在抱怨**日期和日歷類**。 原因很多,例如難以理解,難以使用和不靈活。 `Date`類甚至已經過時,并且 Java 文檔建議使用`Calendar`類而不是`Date`類。 最重要的是,**日期比較**有很多問題,我過去也遇到過這樣的問題。 ![Java 8 date api changes](https://img.kancloud.cn/6d/84/6d8460699e4f665a2653f20b66751b96_250x156.png) 展望未來,JAVA 8([Lambda](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/))有望發布新的日期和時間 API / 類([**JSR-310**](https://java.net/projects/jsr-310/ "jsr-310")),也稱為 **ThreeTen** ,它將僅更改您到目前為止的操作方式。 這的一個關鍵部分是提供一個新的 API,該 API 顯著易于使用且不易出錯。 它將提供一些非常需要的特性,例如: * 所有關鍵的公共類都是不可變的并且是線程安全的 * 其他計算領域可以采用的定義的術語和行為 我在 2013 年 5 月 15 日撰寫了這篇文章。 現在是 2014 年 3 月 18 日,今天終于可以發布 Java 8 了,可以早期使用。 我已經重新驗證并驗證了示例中的所有輸出。 與去年 5 月一樣,它們像魔術一樣工作。 唯一遇到的更改是在`TemporalAdjuster.java`中。 以前是一個類,現在是`@FunctionalInterface`。 因此,我更正了相關示例,并使用了`TemporalAdjusters.java`類。 ```java Table of Contents New classes to represent local date and timezone New classes to represent timestamp and duration Added utility classes over existing enums Date adjusters introduced Building dates will be easier New class to simulate system/machine clock Timezone handling related changes Date formatting changes References ``` ## 代表本地日期和時區的新類 打算替換`Date`類的新類是`LocalDate`,`LocalTime`和`LocalDateTime`。 #### `LocalDate` [`LocalDate`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)類表示日期。 沒有時間或時區的表示。 ```java LocalDate localDate = LocalDate.now(); System.out.println(localDate.toString()); //2013-05-15 System.out.println(localDate.getDayOfWeek().toString()); //WEDNESDAY System.out.println(localDate.getDayOfMonth()); //15 System.out.println(localDate.getDayOfYear()); //135 System.out.println(localDate.isLeapYear()); //false System.out.println(localDate.plusDays(12).toString()); //2013-05-27 ``` #### `LocalTime` [`LocalTime`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html)類表示時間。 沒有日期或時區的表示。 ```java //LocalTime localTime = LocalTime.now(); //toString() in format 09:57:59.744 LocalTime localTime = LocalTime.of(12, 20); System.out.println(localTime.toString()); //12:20 System.out.println(localTime.getHour()); //12 System.out.println(localTime.getMinute()); //20 System.out.println(localTime.getSecond()); //0 System.out.println(localTime.MIDNIGHT); //00:00 System.out.println(localTime.NOON); //12:00 ``` #### `LocalDateTime` [`LocalDateTime`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html)類表示日期時間。 沒有時區的表示。 ```java LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.toString()); //2013-05-15T10:01:14.911 System.out.println(localDateTime.getDayOfMonth()); //15 System.out.println(localDateTime.getHour()); //10 System.out.println(localDateTime.getNano()); //911000000 ``` 如果您想將日期特性與區域信息一起使用,則 Lambda 會為您提供額外的 3 類,類似于上面的一種,即`OffsetDate`,`OffsetTime`和`OffsetDateTime`。 時區偏移可以以“`+05:30`”或“`Europe/Paris`”格式表示。 這是通過使用另一個類即`ZoneId`完成的。 ```java OffsetDateTime offsetDateTime = OffsetDateTime.now(); System.out.println(offsetDateTime.toString()); //2013-05-15T10:10:37.257+05:30 offsetDateTime = OffsetDateTime.now(ZoneId.of(&quot;+05:30&quot;)); System.out.println(offsetDateTime.toString()); //2013-05-15T10:10:37.258+05:30 offsetDateTime = OffsetDateTime.now(ZoneId.of(&quot;-06:30&quot;)); System.out.println(offsetDateTime.toString()); //2013-05-14T22:10:37.258-06:30 ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of(&quot;Europe/Paris&quot;)); System.out.println(zonedDateTime.toString()); //2013-05-15T06:45:45.290+02:00[Europe/Paris] ``` ## 代表時間戳和持續時間的新類 #### `Instant` 為了隨時表示特定的時間戳,需要使用的類是[`Instant`](https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html)。 `Instant`類表示精確到納秒的時間點。 對`Instant`的操作包括與另一個`Instant`的比較以及持續時間的增加或減少。 ```java Instant instant = Instant.now(); System.out.println(instant.toString()); //2013-05-15T05:20:08.145Z System.out.println(instant.plus(Duration.ofMillis(5000)).toString()); //2013-05-15T05:20:13.145Z System.out.println(instant.minus(Duration.ofMillis(5000)).toString()); //2013-05-15T05:20:03.145Z System.out.println(instant.minusSeconds(10).toString()); //2013-05-15T05:19:58.145Z ``` #### `Duration` [`Duration`](https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html)類是用 Java 語言首次帶來的全新概念。 它表示兩個時間戳之間的差異。 ```java Duration duration = Duration.ofMillis(5000); System.out.println(duration.toString()); //PT5S duration = Duration.ofSeconds(60); System.out.println(duration.toString()); //PT1M duration = Duration.ofMinutes(10); System.out.println(duration.toString()); //PT10M duration = Duration.ofHours(2); System.out.println(duration.toString()); //PT2H duration = Duration.between(Instant.now(), Instant.now().plus(Duration.ofMinutes(10))); System.out.println(duration.toString()); //PT10M ``` `Duration`處理較小的時間單位,例如毫秒,秒,分鐘和小時。 它們更適合與應用程序代碼進行交互。 #### `Period` 要與人互動,您需要獲得更大的持續時間,并以[`Period`](https://docs.oracle.com/javase/8/docs/api/java/time/Period.html)類給出。 ```java Period period = Period.ofDays(6); System.out.println(period.toString()); //P6D period = Period.ofMonths(6); System.out.println(period.toString()); //P6M period = Period.between(LocalDate.now(), LocalDate.now().plusDays(60)); System.out.println(period.toString()); //P1M29D ``` ## 在現有枚舉上添加的工具類 當前的 Java SE 平臺使用`int`常量表示月份,星期幾和上午下午等。現在,添加了許多額外的工具類,它們在這些枚舉的基礎上起作用。 我以這樣的類為例:[`DayOfWeek`](https://docs.oracle.com/javase/8/docs/api/java/time/DayOfWeek.html)。 該類是每周日期枚舉的包裝,并且可以與其他類一致使用。 #### `DayOfWeek` ```java //day-of-week to represent, from 1 (Monday) to 7 (Sunday) System.out.println(DayOfWeek.of(2)); //TUESDAY DayOfWeek day = DayOfWeek.FRIDAY; System.out.println(day.getValue()); //5 LocalDate localDate = LocalDate.now(); System.out.println(localDate.with(DayOfWeek.MONDAY)); //2013-05-13 i.e. when was monday in current week ? ``` 其他此類類別是`Month`,`MonthDay`,`Year`和`YearMonth`等。 ## 日期調整器 日期調節器是日期處理工具中另一個美觀實用的特性。 它可以輕松解決以下問題:您如何*查找一個月的最后一天*? 還是下一個工作日? 還是星期二一個星期? 讓我們看一下代碼。 ```java LocalDate date = LocalDate.of(2013, Month.MAY, 15); //Today LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth()); System.out.println(endOfMonth.toString()); //2013-05-31 LocalDate nextTue = date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); System.out.println(nextTue.toString()); //2013-05-21 ``` ## 創建日期對象 現在也可以使用[構建器模式](//howtodoinjava.com/design-patterns/creational/builder-pattern-in-java/)創建日期對象。 構建器模式允許使用單例來構建您想要的對象。 這是通過使用以`at`為前綴的方法來實現的。 ```java //Builder pattern used to make date object OffsetDateTime date1 = Year.of(2013) .atMonth(Month.MAY).atDay(15) .atTime(0, 0) .atOffset(ZoneOffset.of(&quot;+03:00&quot;)); System.out.println(date1); //2013-05-15T00:00+03:00 //factory method used to make date object OffsetDateTime date2 = OffsetDateTime. of(2013, 5, 15, 0, 0, 0, 0, ZoneOffset.of(&quot;+03:00&quot;)); System.out.println(date2); //2013-05-15T00:00+03:00 ``` ## 模擬系統/機器時鐘的新類 在新版本中提出了新的類[時鐘](https://docs.oracle.com/javase/8/docs/api/java/time/Clock.html)。 該**模擬系統時鐘特性**。 我最喜歡這個特性。 原因是在進行單元測試時。 您通常需要在將來的日期測試 API。 為此,我們已經將系統時鐘轉發到下一個日期,然后再次重新啟動服務器并測試應用程序。 現在,無需這樣做。 使用`Clock`類可以模擬這種情況。 ```java Clock clock = Clock.systemDefaultZone(); System.out.println(clock); //SystemClock[Asia/Calcutta] System.out.println(clock.instant().toString()); //2013-05-15T06:36:33.837Z System.out.println(clock.getZone()); //Asia/Calcutta Clock anotherClock = Clock.system(ZoneId.of(&quot;Europe/Tiraspol&quot;)); System.out.println(anotherClock); //SystemClock[Europe/Tiraspol] System.out.println(anotherClock.instant().toString()); //2013-05-15T06:36:33.857Z System.out.println(anotherClock.getZone()); //Europe/Tiraspol Clock forwardedClock = Clock.tick(anotherClock, Duration.ofSeconds(600)); System.out.println(forwardedClock.instant().toString()); //2013-05-15T06:30Z ``` ## 時區變更 與時區相關的處理由 3 個主要類別完成。 這些是[`ZoneOffset`](https://docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html) ,[`TimeZone`](https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html) ,[`ZoneRules`](https://docs.oracle.com/javase/8/docs/api/java/time/zone/ZoneRules.html)。 * `ZoneOffset`類表示與 UTC 的固定偏移量,以秒為單位。 通常以`±hh:mm`格式的字符串表示。 * `TimeZone`類表示在其中定義了指定時區規則的區域的標識符。 * `ZoneRules`是定義區域偏移量何時更改的實際規則集。 ```java //Zone rules System.out.println(ZoneRules.of(ZoneOffset.of(&quot;+02:00&quot;)).isDaylightSavings(Instant.now())); System.out.println(ZoneRules.of(ZoneOffset.of(&quot;+02:00&quot;)).isFixedOffset()); ``` ## 日期格式化 日期格式化通過兩個類別(主要是`DateTimeFormatterBuilder`和`DateTimeFormatter`)支持。 `DateTimeFormatterBuilder`使用構建器模式來構建自定義模式,因為`DateTimeFormatter`為此提供了必要的輸入。 ```java DateTimeFormatterBuilder formatterBuilder = new DateTimeFormatterBuilder(); formatterBuilder.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) .appendLiteral(&quot;-&quot;) .appendZoneOrOffsetId(); DateTimeFormatter formatter = formatterBuilder.toFormatter(); System.out.println(formatter.format(ZonedDateTime.now())); ``` 這些是我能夠識別并進行的重大更改。 ## 參考文獻 * [https://jdk8.java.net/lambda/](https://jdk8.java.net/lambda/ "download lambda") * [http://sourceforge.net/apps/mediawiki/threeten/index.php?title=User_Guide](https://sourceforge.net/apps/mediawiki/threeten/index.php?title=User_Guide "date changes ref doc") **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看