本文編寫的單元測試是基于java11,具體的版本號是:11.0.19
LocalDateTime 是 Java 8 中引入的一個新的日期時間 API,它表示一個沒有時區的日期時間對象,是不可變且線程安全的。LocalDateTime 通常用于需要同時表示日期和時間,但不涉及時區的場景。
LocalDateTime、LocalDate和LocalTime都是Java中用于表示日期和時間的數據類型,但它們在功能和使用上有一些重要的區別。
功能:
使用場景:
功能:
使用場景
LocalDateTime#now() 用于獲取當前的日期和時間,不包含時區信息。
@Test public void test() { LocalDateTime now = LocalDateTime.now(); String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(format);//當前日期和時間:2023-11-27 11:23:54 }
LocalDateTime#of(...)、LocalDateTime#ofInstant(...)、LocalDateTime#ofEpochSecond(...)
@Test public void test2() { LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 27, 11, 27, 56); System.out.println(localDateTime);//輸出結果:2023-11-27T11:27:56 LocalDate localDate = LocalDate.of(2023, 11, 27); LocalTime localTime = LocalTime.of(11, 27, 56); LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime); System.out.println(localDateTime1);//輸出結果:2023-11-27T11:27:56 LocalDateTime localDateTime2 = LocalDateTime.ofInstant(Instant.ofEpochSecond(61), ZoneId.systemDefault()); System.out.println(localDateTime2);//輸出結果:1970-01-01T08:01:01 LocalDateTime localDateTime3 = LocalDateTime.ofEpochSecond(61, 0, ZoneOffset.ofHours(8)); System.out.println(localDateTime3);//輸出結果:1970-01-01T08:01:01 }
LocalDateTime#from(...)用于從給定的日期時間對象中創建一個新的LocalDateTime實例。這個方法接受一個Object類型的參數,這個對象需要是以下類型之一:
當給定的日期時間對象為以上所列出的類型之一時,LocalDateTime#from(...)方法會嘗試從中提取日期和時間信息,并創建一個新的LocalDateTime實例。如果給定的對象無法轉換為LocalDateTime,那么這個方法會拋出一個DateTimeException異常。
這個方法的使用場景通常是在需要將一個日期時間對象轉換為LocalDateTime,以便進行后續的日期和時間運算或處理。例如,你可能從數據庫中獲取了一個日期時間戳,然后你需要將這個日期時間戳轉換為LocalDateTime,以便進行進一步的計算或處理。或者,你可能需要從一個具有特定時區的日期時間對象中創建一個沒有時區的LocalDateTime。
@Test public void test3() { LocalDateTime localDateTime = LocalDateTime.parse("2023-11-2711:36:56", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDateTime from = LocalDateTime.from(localDateTime); System.out.println(from);//輸出結果:2023-11-2711:36:56 }
LocalDateTime#parse(...) 用于將字符串解析為 LocalDateTime 對象的函數。該方法使用一個字符串作為輸入,并根據該字符串的內容創建一個新的 LocalDateTime 對象。
在使用該方法時,該字符串必須符合 ISO 8601 格式,例如 "2019-01-01T12:00:00",另外還需要注意時區的問題。如果字符串中沒有指定時區信息,那么解析出來的 LocalDateTime 對象將是本地時區的時間。如果需要指定時區,可以使用 ZoneId 類的 of 方法來創建時區對象,然后使用 LocalDateTime.atZone 方法將 LocalDateTime 對象轉換為 ZonedDateTime 對象,最后再使用 ZonedDateTime.toLocalDateTime 方法將其轉換為指定時區的 LocalDateTime 對象。
@Test public void test4() { LocalDateTime localDateTime = LocalDateTime.parse("2023-11-2711:36:56", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(localDateTime);//輸出結果:2023-11-2711:36:56 }
LocalDateTime#isSupported() 用于檢查是否支持特定的單位或字段。該方法接受一個參數,可以是 TemporalUnit 或 TemporalField 對象,用于指定要檢查的單位或字段。如果支持,方法將返回 true;如果不支持,方法將返回 false。
使用場景:
@Test public void test5() { LocalDateTime now = LocalDateTime.now(); boolean supported = now.isSupported(ChronoUnit.YEARS); boolean supported1 = now.isSupported(ChronoField.DAY_OF_YEAR); System.out.println(supported);//輸出結果:true System.out.println(supported1);//輸出結果:true }
LocalDateTime#range(...) 用于獲取LocalDateTime對象指定字段的有效值范圍,返回值是一個ValueRange對象,range對象表示字段的最小和最大有效值。此日期時間用于提高返回范圍的準確性。如果由于不支持該字段或其他原因而無法返回范圍,則會引發異常。
@Test public void test6() { LocalDateTime now = LocalDateTime.of(2020, 2, 1, 12, 18, 56); ValueRange range = now.range(ChronoField.DAY_OF_MONTH); long maximum = range.getMaximum(); long minimum = range.getMinimum(); System.out.println(maximum);//輸出結果:29 System.out.println(minimum);//輸出結果:1 LocalDateTime now2 = LocalDateTime.of(2023, 2, 1, 12, 18, 56); ValueRange range2 = now2.range(ChronoField.DAY_OF_MONTH); long maximum2 = range2.getMaximum(); long minimum2 = range2.getMinimum(); System.out.println(maximum2);//輸出結果:28 System.out.println(minimum2);//輸出結果:1 }
LocalDateTime#get(...)、LocalDateTime#getLong(...)、LocalDateTime#getYear(...)、LocalDateTime#getMonthValue(...)、LocalDateTime#getMonth(...)、LocalDateTime#getDayOfMonth(...)、LocalDateTime#getDayOfYear(...)、LocalDateTime#getDayOfWeek(...)、LocalDateTime#getHour(...)、LocalDateTime#getMinute(...)、LocalDateTime#getSecond(...)、LocalDateTime#getNano(...)
@Test public void test7() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); int year = localDateTime.get(ChronoField.YEAR); System.out.println(year);//輸出結果:2020 int month = localDateTime.get(ChronoField.MONTH_OF_YEAR); System.out.println(month);//輸出結果:2 long yearLong = localDateTime.getLong(ChronoField.YEAR); System.out.println(yearLong);//輸出結果:2020 long monthLong = localDateTime.getLong(ChronoField.MONTH_OF_YEAR); System.out.println(monthLong);//輸出結果:2 int year1 = localDateTime.getYear(); System.out.println(year1);//輸出結果:2020 int monthValue = localDateTime.getMonthValue(); System.out.println(monthValue);//輸出結果:2 int dayOfMonth = localDateTime.getDayOfMonth(); System.out.println(dayOfMonth);//輸出結果:1 int dayOfYear = localDateTime.getDayOfYear(); System.out.println(dayOfYear);//輸出結果:32 DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); int dayOfWeekValue = dayOfWeek.getValue(); System.out.println(dayOfWeekValue);//輸出結果:6 int hour = localDateTime.getHour(); System.out.println(hour);//輸出結果:12 int minute = localDateTime.getMinute(); System.out.println(minute);//輸出結果:18 int second = localDateTime.getSecond(); System.out.println(second);//輸出結果:56 }
LocalDateTime#toLocalDate(...)、LocalDateTime#toLocalTime(...)
@Testpublic void test8() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDate localDate = localDateTime.toLocalDate(); LocalTime localTime = localDateTime.toLocalTime(); System.out.println(localDate);//輸出結果:2020-02-01 System.out.println(localTime);//輸出結果:12:18:56}
LocalDateTime#with(...)、LocalDateTime#withYear(...)、LocalDateTime#withMonth(...)、LocalDateTime#withDayOfMonth(...)、LocalDateTime#withDayOfYear(...)、LocalDateTime#withHour(...)、LocalDateTime#withMinute(...)、LocalDateTime#withSecond(...)、LocalDateTime#withNano(...)
上述這些方法可以在不改變日期和時間的其他部分的情況下,對日期和時間的特定部分進行修改和操作。具體來說:
@Testpublic void test9() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); TemporalAdjuster temporalAdjuster = item -> item.plus(1, ChronoUnit.HOURS); LocalDateTime localDateTime1 = localDateTime.with(temporalAdjuster); System.out.println(localDateTime1);//輸出結果:2020-02-01T13:18:56 LocalDateTime localDateTime2 = localDateTime.with(ChronoField.HOUR_OF_DAY, 1); System.out.println(localDateTime2);//輸出結果:2020-02-01T01:18:56 LocalDateTime localDateTime3 = localDateTime.withYear(2023); System.out.println(localDateTime3);//輸出結果:2023-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.withMonth(1); System.out.println(localDateTime4);//輸出結果:2020-01-01T12:18:56 LocalDateTime localDateTime5 = localDateTime.withDayOfMonth(10); System.out.println(localDateTime5);//輸出結果:2020-02-10T12:18:56 LocalDateTime localDateTime6 = localDateTime.withHour(18); System.out.println(localDateTime6);//輸出結果:2020-02-01T18:18:56 LocalDateTime localDateTime7 = localDateTime.withMinute(30); System.out.println(localDateTime7);//輸出結果:2020-02-01T12:30:56 LocalDateTime localDateTime8 = localDateTime.withSecond(59); System.out.println(localDateTime8);//輸出結果:2020-02-01T12:18:59}
LocalDateTime#truncatedTo()用于將當前LocalDateTime對象的時間部分截斷到給定的時間單位。
功能作用:
使用場景:
@Testpublic void test10() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDateTime localDateTime1 = localDateTime.truncatedTo(ChronoUnit.DAYS); System.out.println(localDateTime1);//輸出結果:2020-02-01T00:00}
LocalDateTime#plus(...)、LocalDateTime#plusYears(...)、LocalDateTime#plusMonths(...)、LocalDateTime#plusWeeks(...)、LocalDateTime#plusDays(...)、LocalDateTime#plusHours(...)、LocalDateTime#plusMinutes(...)、LocalDateTime#plusSeconds(...)、LocalDateTime#plusNanos(...)
上述方法,主要用于在現有的日期時間對象上增加指定的時間單位或量。
具體如下:
使用場景:
@Testpublic void test11() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDateTime localDateTime1 = localDateTime.plus(Period.ofDays(3)); LocalDateTime localDateTime2 = localDateTime.plus(3, ChronoUnit.DAYS); System.out.println(localDateTime1);//輸出結果:2020-02-04T12:18:56 System.out.println(localDateTime2);//輸出結果:2020-02-04T12:18:56 LocalDateTime localDateTime3 = localDateTime.plusYears(1); System.out.println(localDateTime3);//輸出結果:2021-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.plusMonths(1); System.out.println(localDateTime4);//輸出結果:2020-03-01T12:18:56 LocalDateTime localDateTime5 = localDateTime.plusWeeks(1); System.out.println(localDateTime5);//輸出結果:2020-02-08T12:18:56 LocalDateTime localDateTime6 = localDateTime.plusDays(10); System.out.println(localDateTime6);//輸出結果:2020-02-11T12:18:56 LocalDateTime localDateTime7 = localDateTime.plusHours(3); System.out.println(localDateTime7);//輸出結果:2020-02-01T15:18:56 LocalDateTime localDateTime8 = localDateTime.plusMinutes(12); System.out.println(localDateTime8);//輸出結果:2020-02-01T12:30:56 LocalDateTime localDateTime9 = localDateTime.plusSeconds(4); System.out.println(localDateTime9);//輸出結果:2020-02-01T12:19}
LocalDateTime#minus(...)、LocalDateTime#minusYears(...)、LocalDateTime#minusMonths(...)、LocalDateTime#minusWeeks(...)、LocalDateTime#minusDays(...)、LocalDateTime#minusHours(...)、LocalDateTime#minusMinutes(...)、LocalDateTime#minusSeconds(...)、LocalDateTime#minusNanos(...)
上述這些方法,用于對日期和時間的減法操作,需要注意的是,這些方法的計算結果值超過限制時可能會拋出DateTimeException異常。
具體如下:
@Testpublic void test12() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDateTime localDateTime1 = localDateTime.minus(Period.ofDays(3)); LocalDateTime localDateTime2 = localDateTime.minus(3, ChronoUnit.DAYS); System.out.println(localDateTime1);//輸出結果:2020-01-29T12:18:56 System.out.println(localDateTime2);//輸出結果:2020-01-29T12:18:56 LocalDateTime localDateTime3 = localDateTime.minusYears(1); System.out.println(localDateTime3);//輸出結果:2019-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.minusMonths(1); System.out.println(localDateTime4);//輸出結果:2020-01-01T12:18:56 LocalDateTime localDateTime5 = localDateTime.minusWeeks(1); System.out.println(localDateTime5);//2020-01-25T12:18:56 LocalDateTime localDateTime6 = localDateTime.minusDays(10); System.out.println(localDateTime6);//輸出結果:2020-01-22T12:18:56 LocalDateTime localDateTime7 = localDateTime.minusHours(3); System.out.println(localDateTime7);//輸出結果:2020-02-01T09:18:56 LocalDateTime localDateTime8 = localDateTime.minusMinutes(12); System.out.println(localDateTime8);//輸出結果:2020-02-01T12:06:56 LocalDateTime localDateTime9 = localDateTime.minusSeconds(4); System.out.println(localDateTime9);//輸出結果:2020-02-01T12:18:52}
LocalDateTime#query()接受一個TemporalQuery作為參數,用于查詢此LocalDateTime。查詢的結果會根據傳遞的查詢邏輯來決定。通常在需要基于特定的查詢邏輯處理日期和時間的情況下使用。傳遞給查詢方法的邏輯是通過TemporalQuery對象定義的。因此,這個方法在使用時需要結合具體的查詢需求和TemporalQuery的實現來使用。
@Testpublic void test13() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); TemporalQuery<Integer> temporalQuery = item -> item.get(ChronoField.YEAR); Integer year = localDateTime.query(temporalQuery); System.out.println(year);//輸出結果:2020}
LocalDateTime#until() 方法用于計算兩個 LocalDateTime 對象之間的時間量,并以指定的 TemporalUnit 為單位返回結果。這個方法返回一個整數,表示兩個 LocalDateTime 對象之間完整的時間單位數。
功能作用:
使用場景:
@Testpublic void test14() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); long until = localDateTime.until(LocalDateTime.of(2023, 2, 1, 12, 30, 56), ChronoUnit.YEARS); System.out.println(until);//輸出結果:3}
LocalDateTime#format(...)用于將當前 LocalDateTime 對象格式化為指定的日期時間字符串。
@Testpublic void test15() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(format);//輸出結果:2020-02-01 12:18:56}
LocalDateTime#atOffset(...)
LocalDateTime#atOffset() 主要是用于合并當前LocalDateTime對象與給定的偏移量。具體來說,該方法創建并返回一個 OffsetDateTime 對象,該對象將保存將當前LocalDateTime 與給定偏移量合并后的值。主要在需要對LocalDateTime對象進行偏移量調整的情況下使用。例如,如果你需要根據當前的LocalDateTime創建一個在特定偏移量(如一小時,一天)后的日期時間,就可以通過使用LocalDateTime#atOffset()方法來實現。這個方法的使用非常靈活,你可以根據需要選擇不同的偏移量進行合并,得到的 OffsetDateTime 對象可以用于進一步的日期時間計算或展示等操作。
@Testpublic void test16() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime);//輸出結果:2020-02-01T12:18:56+08:00}
LocalDateTime#atZone()用于將給定的LocalDateTime對象合并到給定的時區,從而創建一個ZonedDateTime對象。該方法是一個非靜態方法,只能通過類對象訪問。通過該方法,可以將在不同時區存儲的日期時間數據統一到一個時區中進行處理和比較。
使用場景:
@Testpublic void test17() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); System.out.println(zonedDateTime);//輸出結果:2020-02-01T12:18:56+08:00[Asia/Shanghai]}
LocalDateTime#compareTo(...)、LocalDateTime#isAfter(...)、LocalDateTime#isBefore(...)、LocalDateTime#isEqual(...)
@Testpublic void test18() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDateTime localDateTime2 = LocalDateTime.of(2023, 2, 1, 12, 18, 56); int compareTo = localDateTime2.compareTo(localDateTime); System.out.println(compareTo);//輸出結果:3 boolean before = localDateTime2.isBefore(localDateTime); System.out.println(before);//輸出結果:false boolean after = localDateTime2.isAfter(localDateTime); System.out.println(after);//輸出結果:true boolean equal = localDateTime2.isEqual(localDateTime); System.out.println(equal);//輸出結果:false}
在使用 LocalDateTime 時,有一些注意事項需要特別注意,了解這些限制和注意事項可以確保正確有效地使用它:
本文鏈接:http://www.www897cc.com/showinfo-26-72428-0.html深入了解Java 8 新特性-日期時間API之LocalDateTime類
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
下一篇: 【踩坑指南】線程池使用不當的五個坑