本文編寫的單元測(cè)試是基于java11,具體的版本號(hào)是:11.0.19
LocalDateTime 是 Java 8 中引入的一個(gè)新的日期時(shí)間 API,它表示一個(gè)沒(méi)有時(shí)區(qū)的日期時(shí)間對(duì)象,是不可變且線程安全的。LocalDateTime 通常用于需要同時(shí)表示日期和時(shí)間,但不涉及時(shí)區(qū)的場(chǎng)景。
LocalDateTime、LocalDate和LocalTime都是Java中用于表示日期和時(shí)間的數(shù)據(jù)類型,但它們?cè)诠δ芎褪褂蒙嫌幸恍┲匾膮^(qū)別。
功能:
使用場(chǎng)景:
功能:
使用場(chǎng)景
LocalDateTime#now() 用于獲取當(dāng)前的日期和時(shí)間,不包含時(shí)區(qū)信息。
@Test public void test() { LocalDateTime now = LocalDateTime.now(); String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(format);//當(dāng)前日期和時(shí)間: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);//輸出結(jié)果: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);//輸出結(jié)果:2023-11-27T11:27:56 LocalDateTime localDateTime2 = LocalDateTime.ofInstant(Instant.ofEpochSecond(61), ZoneId.systemDefault()); System.out.println(localDateTime2);//輸出結(jié)果:1970-01-01T08:01:01 LocalDateTime localDateTime3 = LocalDateTime.ofEpochSecond(61, 0, ZoneOffset.ofHours(8)); System.out.println(localDateTime3);//輸出結(jié)果:1970-01-01T08:01:01 }
LocalDateTime#from(...)用于從給定的日期時(shí)間對(duì)象中創(chuàng)建一個(gè)新的LocalDateTime實(shí)例。這個(gè)方法接受一個(gè)Object類型的參數(shù),這個(gè)對(duì)象需要是以下類型之一:
當(dāng)給定的日期時(shí)間對(duì)象為以上所列出的類型之一時(shí),LocalDateTime#from(...)方法會(huì)嘗試從中提取日期和時(shí)間信息,并創(chuàng)建一個(gè)新的LocalDateTime實(shí)例。如果給定的對(duì)象無(wú)法轉(zhuǎn)換為L(zhǎng)ocalDateTime,那么這個(gè)方法會(huì)拋出一個(gè)DateTimeException異常。
這個(gè)方法的使用場(chǎng)景通常是在需要將一個(gè)日期時(shí)間對(duì)象轉(zhuǎn)換為L(zhǎng)ocalDateTime,以便進(jìn)行后續(xù)的日期和時(shí)間運(yùn)算或處理。例如,你可能從數(shù)據(jù)庫(kù)中獲取了一個(gè)日期時(shí)間戳,然后你需要將這個(gè)日期時(shí)間戳轉(zhuǎn)換為L(zhǎng)ocalDateTime,以便進(jìn)行進(jìn)一步的計(jì)算或處理?;蛘?,你可能需要從一個(gè)具有特定時(shí)區(qū)的日期時(shí)間對(duì)象中創(chuàng)建一個(gè)沒(méi)有時(shí)區(qū)的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);//輸出結(jié)果:2023-11-2711:36:56 }
LocalDateTime#parse(...) 用于將字符串解析為 LocalDateTime 對(duì)象的函數(shù)。該方法使用一個(gè)字符串作為輸入,并根據(jù)該字符串的內(nèi)容創(chuàng)建一個(gè)新的 LocalDateTime 對(duì)象。
在使用該方法時(shí),該字符串必須符合 ISO 8601 格式,例如 "2019-01-01T12:00:00",另外還需要注意時(shí)區(qū)的問(wèn)題。如果字符串中沒(méi)有指定時(shí)區(qū)信息,那么解析出來(lái)的 LocalDateTime 對(duì)象將是本地時(shí)區(qū)的時(shí)間。如果需要指定時(shí)區(qū),可以使用 ZoneId 類的 of 方法來(lái)創(chuàng)建時(shí)區(qū)對(duì)象,然后使用 LocalDateTime.atZone 方法將 LocalDateTime 對(duì)象轉(zhuǎn)換為 ZonedDateTime 對(duì)象,最后再使用 ZonedDateTime.toLocalDateTime 方法將其轉(zhuǎn)換為指定時(shí)區(qū)的 LocalDateTime 對(duì)象。
@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);//輸出結(jié)果:2023-11-2711:36:56 }
LocalDateTime#isSupported() 用于檢查是否支持特定的單位或字段。該方法接受一個(gè)參數(shù),可以是 TemporalUnit 或 TemporalField 對(duì)象,用于指定要檢查的單位或字段。如果支持,方法將返回 true;如果不支持,方法將返回 false。
使用場(chǎng)景:
@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);//輸出結(jié)果:true System.out.println(supported1);//輸出結(jié)果:true }
LocalDateTime#range(...) 用于獲取LocalDateTime對(duì)象指定字段的有效值范圍,返回值是一個(gè)ValueRange對(duì)象,range對(duì)象表示字段的最小和最大有效值。此日期時(shí)間用于提高返回范圍的準(zhǔn)確性。如果由于不支持該字段或其他原因而無(wú)法返回范圍,則會(huì)引發(fā)異常。
@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);//輸出結(jié)果:29 System.out.println(minimum);//輸出結(jié)果: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);//輸出結(jié)果:28 System.out.println(minimum2);//輸出結(jié)果: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);//輸出結(jié)果:2020 int month = localDateTime.get(ChronoField.MONTH_OF_YEAR); System.out.println(month);//輸出結(jié)果:2 long yearLong = localDateTime.getLong(ChronoField.YEAR); System.out.println(yearLong);//輸出結(jié)果:2020 long monthLong = localDateTime.getLong(ChronoField.MONTH_OF_YEAR); System.out.println(monthLong);//輸出結(jié)果:2 int year1 = localDateTime.getYear(); System.out.println(year1);//輸出結(jié)果:2020 int monthValue = localDateTime.getMonthValue(); System.out.println(monthValue);//輸出結(jié)果:2 int dayOfMonth = localDateTime.getDayOfMonth(); System.out.println(dayOfMonth);//輸出結(jié)果:1 int dayOfYear = localDateTime.getDayOfYear(); System.out.println(dayOfYear);//輸出結(jié)果:32 DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); int dayOfWeekValue = dayOfWeek.getValue(); System.out.println(dayOfWeekValue);//輸出結(jié)果:6 int hour = localDateTime.getHour(); System.out.println(hour);//輸出結(jié)果:12 int minute = localDateTime.getMinute(); System.out.println(minute);//輸出結(jié)果:18 int second = localDateTime.getSecond(); System.out.println(second);//輸出結(jié)果: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);//輸出結(jié)果:2020-02-01 System.out.println(localTime);//輸出結(jié)果:12:18:56}
LocalDateTime#with(...)、LocalDateTime#withYear(...)、LocalDateTime#withMonth(...)、LocalDateTime#withDayOfMonth(...)、LocalDateTime#withDayOfYear(...)、LocalDateTime#withHour(...)、LocalDateTime#withMinute(...)、LocalDateTime#withSecond(...)、LocalDateTime#withNano(...)
上述這些方法可以在不改變?nèi)掌诤蜁r(shí)間的其他部分的情況下,對(duì)日期和時(shí)間的特定部分進(jìn)行修改和操作。具體來(lái)說(shuō):
@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);//輸出結(jié)果:2020-02-01T13:18:56 LocalDateTime localDateTime2 = localDateTime.with(ChronoField.HOUR_OF_DAY, 1); System.out.println(localDateTime2);//輸出結(jié)果:2020-02-01T01:18:56 LocalDateTime localDateTime3 = localDateTime.withYear(2023); System.out.println(localDateTime3);//輸出結(jié)果:2023-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.withMonth(1); System.out.println(localDateTime4);//輸出結(jié)果:2020-01-01T12:18:56 LocalDateTime localDateTime5 = localDateTime.withDayOfMonth(10); System.out.println(localDateTime5);//輸出結(jié)果:2020-02-10T12:18:56 LocalDateTime localDateTime6 = localDateTime.withHour(18); System.out.println(localDateTime6);//輸出結(jié)果:2020-02-01T18:18:56 LocalDateTime localDateTime7 = localDateTime.withMinute(30); System.out.println(localDateTime7);//輸出結(jié)果:2020-02-01T12:30:56 LocalDateTime localDateTime8 = localDateTime.withSecond(59); System.out.println(localDateTime8);//輸出結(jié)果:2020-02-01T12:18:59}
LocalDateTime#truncatedTo()用于將當(dāng)前LocalDateTime對(duì)象的時(shí)間部分截?cái)嗟浇o定的時(shí)間單位。
功能作用:
使用場(chǎng)景:
@Testpublic void test10() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); LocalDateTime localDateTime1 = localDateTime.truncatedTo(ChronoUnit.DAYS); System.out.println(localDateTime1);//輸出結(jié)果:2020-02-01T00:00}
LocalDateTime#plus(...)、LocalDateTime#plusYears(...)、LocalDateTime#plusMonths(...)、LocalDateTime#plusWeeks(...)、LocalDateTime#plusDays(...)、LocalDateTime#plusHours(...)、LocalDateTime#plusMinutes(...)、LocalDateTime#plusSeconds(...)、LocalDateTime#plusNanos(...)
上述方法,主要用于在現(xiàn)有的日期時(shí)間對(duì)象上增加指定的時(shí)間單位或量。
具體如下:
使用場(chǎng)景:
@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);//輸出結(jié)果:2020-02-04T12:18:56 System.out.println(localDateTime2);//輸出結(jié)果:2020-02-04T12:18:56 LocalDateTime localDateTime3 = localDateTime.plusYears(1); System.out.println(localDateTime3);//輸出結(jié)果:2021-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.plusMonths(1); System.out.println(localDateTime4);//輸出結(jié)果:2020-03-01T12:18:56 LocalDateTime localDateTime5 = localDateTime.plusWeeks(1); System.out.println(localDateTime5);//輸出結(jié)果:2020-02-08T12:18:56 LocalDateTime localDateTime6 = localDateTime.plusDays(10); System.out.println(localDateTime6);//輸出結(jié)果:2020-02-11T12:18:56 LocalDateTime localDateTime7 = localDateTime.plusHours(3); System.out.println(localDateTime7);//輸出結(jié)果:2020-02-01T15:18:56 LocalDateTime localDateTime8 = localDateTime.plusMinutes(12); System.out.println(localDateTime8);//輸出結(jié)果:2020-02-01T12:30:56 LocalDateTime localDateTime9 = localDateTime.plusSeconds(4); System.out.println(localDateTime9);//輸出結(jié)果:2020-02-01T12:19}
LocalDateTime#minus(...)、LocalDateTime#minusYears(...)、LocalDateTime#minusMonths(...)、LocalDateTime#minusWeeks(...)、LocalDateTime#minusDays(...)、LocalDateTime#minusHours(...)、LocalDateTime#minusMinutes(...)、LocalDateTime#minusSeconds(...)、LocalDateTime#minusNanos(...)
上述這些方法,用于對(duì)日期和時(shí)間的減法操作,需要注意的是,這些方法的計(jì)算結(jié)果值超過(guò)限制時(shí)可能會(huì)拋出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);//輸出結(jié)果:2020-01-29T12:18:56 System.out.println(localDateTime2);//輸出結(jié)果:2020-01-29T12:18:56 LocalDateTime localDateTime3 = localDateTime.minusYears(1); System.out.println(localDateTime3);//輸出結(jié)果:2019-02-01T12:18:56 LocalDateTime localDateTime4 = localDateTime.minusMonths(1); System.out.println(localDateTime4);//輸出結(jié)果: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);//輸出結(jié)果:2020-01-22T12:18:56 LocalDateTime localDateTime7 = localDateTime.minusHours(3); System.out.println(localDateTime7);//輸出結(jié)果:2020-02-01T09:18:56 LocalDateTime localDateTime8 = localDateTime.minusMinutes(12); System.out.println(localDateTime8);//輸出結(jié)果:2020-02-01T12:06:56 LocalDateTime localDateTime9 = localDateTime.minusSeconds(4); System.out.println(localDateTime9);//輸出結(jié)果:2020-02-01T12:18:52}
LocalDateTime#query()接受一個(gè)TemporalQuery作為參數(shù),用于查詢此LocalDateTime。查詢的結(jié)果會(huì)根據(jù)傳遞的查詢邏輯來(lái)決定。通常在需要基于特定的查詢邏輯處理日期和時(shí)間的情況下使用。傳遞給查詢方法的邏輯是通過(guò)TemporalQuery對(duì)象定義的。因此,這個(gè)方法在使用時(shí)需要結(jié)合具體的查詢需求和TemporalQuery的實(shí)現(xiàn)來(lái)使用。
@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);//輸出結(jié)果:2020}
LocalDateTime#until() 方法用于計(jì)算兩個(gè) LocalDateTime 對(duì)象之間的時(shí)間量,并以指定的 TemporalUnit 為單位返回結(jié)果。這個(gè)方法返回一個(gè)整數(shù),表示兩個(gè) LocalDateTime 對(duì)象之間完整的時(shí)間單位數(shù)。
功能作用:
使用場(chǎng)景:
@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);//輸出結(jié)果:3}
LocalDateTime#format(...)用于將當(dāng)前 LocalDateTime 對(duì)象格式化為指定的日期時(shí)間字符串。
@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);//輸出結(jié)果:2020-02-01 12:18:56}
LocalDateTime#atOffset(...)
LocalDateTime#atOffset() 主要是用于合并當(dāng)前LocalDateTime對(duì)象與給定的偏移量。具體來(lái)說(shuō),該方法創(chuàng)建并返回一個(gè) OffsetDateTime 對(duì)象,該對(duì)象將保存將當(dāng)前LocalDateTime 與給定偏移量合并后的值。主要在需要對(duì)LocalDateTime對(duì)象進(jìn)行偏移量調(diào)整的情況下使用。例如,如果你需要根據(jù)當(dāng)前的LocalDateTime創(chuàng)建一個(gè)在特定偏移量(如一小時(shí),一天)后的日期時(shí)間,就可以通過(guò)使用LocalDateTime#atOffset()方法來(lái)實(shí)現(xiàn)。這個(gè)方法的使用非常靈活,你可以根據(jù)需要選擇不同的偏移量進(jìn)行合并,得到的 OffsetDateTime 對(duì)象可以用于進(jìn)一步的日期時(shí)間計(jì)算或展示等操作。
@Testpublic void test16() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime);//輸出結(jié)果:2020-02-01T12:18:56+08:00}
LocalDateTime#atZone()用于將給定的LocalDateTime對(duì)象合并到給定的時(shí)區(qū),從而創(chuàng)建一個(gè)ZonedDateTime對(duì)象。該方法是一個(gè)非靜態(tài)方法,只能通過(guò)類對(duì)象訪問(wèn)。通過(guò)該方法,可以將在不同時(shí)區(qū)存儲(chǔ)的日期時(shí)間數(shù)據(jù)統(tǒng)一到一個(gè)時(shí)區(qū)中進(jìn)行處理和比較。
使用場(chǎng)景:
@Testpublic void test17() { LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 1, 12, 18, 56); ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); System.out.println(zonedDateTime);//輸出結(jié)果: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);//輸出結(jié)果:3 boolean before = localDateTime2.isBefore(localDateTime); System.out.println(before);//輸出結(jié)果:false boolean after = localDateTime2.isAfter(localDateTime); System.out.println(after);//輸出結(jié)果:true boolean equal = localDateTime2.isEqual(localDateTime); System.out.println(equal);//輸出結(jié)果:false}
在使用 LocalDateTime 時(shí),有一些注意事項(xiàng)需要特別注意,了解這些限制和注意事項(xiàng)可以確保正確有效地使用它:
本文鏈接:http://www.tebozhan.com/showinfo-26-72428-0.html深入了解Java 8 新特性-日期時(shí)間API之LocalDateTime類
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com