工商企業(yè)查詢網楓樹seo網
閱讀建議
嗨,伙計!刷到這篇文章咱們就是有緣人,在閱讀這篇文章前我有一些建議:
- 本篇文章大概19000多字,預計閱讀時間長需要10分鐘以上。
- 本篇文章的實戰(zhàn)性、理論性較強,是一篇質量分數較高的技術干貨文章,建議收藏起來,方便時常學習與回顧,溫故而知新。
- 創(chuàng)作不易,免費的點贊、關注,請走上一走,算是對博主一些鼓勵,讓我更有動力輸出更多的干貨內容。
注意
本文編寫的單元測試是基于java11,具體的版本號是:11.0.19
關于ZonedDateTime
ZonedDateTime是Java 8中引入的一個不可變且線程安全的數據類型,用于表示帶有時區(qū)的日期和時間。與LocalDateTime相比,ZonedDateTime可以存儲時區(qū)信息,并能夠處理模糊的本地日期時間。
ZonedDateTime可以表示從本地時間線LocalDateTime到即時時間線Instant之間的日期和時間。兩個時間線之間的差異是UTC /格林威治的偏移量,由ZoneOffset表示。在兩個時間線之間轉換涉及使用從ZoneId訪問的ZoneId計算偏移量。
ZonedDateTime的常用方法包括獲取年份、月份、日期、小時、分鐘、秒等信息的get方法,以及計算兩個日期之間的差值的minus方法等。ZonedDateTime還提供了用于獲取當前日期和時間的now方法,以及用于將ZonedDateTime轉換為其它日期/時間類型的toLocalDate、toLocalTime等方法。
需要注意的是,ZonedDateTime在進行時區(qū)轉換時可能會遇到夏令時調整的情況,此時需要使用正確的時區(qū)信息以避免錯誤的出現(xiàn)。另外,在處理涉及時區(qū)的日期和時間時,需要考慮時區(qū)偏移量以及時間線之間的差異等問題。
核心方法
ZonedDateTime#now()
ZonedDateTime#now()?用于獲取當前時間。它返回一個表示當前日期和時間的ZonedDateTime?對象,包括時區(qū)和偏移量。
@Test
public void test() {ZonedDateTime zonedDateTime = ZonedDateTime.now();System.out.println(zonedDateTime);//輸出結果:2023-11-29T13:31:38.124890400+08:00[Asia/Shanghai]
}
ZonedDateTime#of(...)、ZonedDateTime#ofLocal(...)、ZonedDateTime#ofInstant(...)、ZonedDateTime#ofStrict(...)
- ZonedDateTime#of(...): 該方法用于從年、月、日、時、分、秒和時區(qū)中獲取ZonedDateTime的實例。所有這些值分別是年、月、日、時、分、秒和時區(qū)作為參數傳遞。
- ZonedDateTime#ofLocal(LocalDateTime, ZoneId, ZoneOffset): 該方法用于使用ZonmeId和首選偏移量從本地日期時間創(chuàng)建ZonedDateTime實例。
- ZonedDateTime#ofInstant(Instant, ZoneId): 該方法用于從Instant和ZoneId中獲取ZonedDateTime實例。
- ZonedDateTime#ofStrict(LocalDateTime, ZoneId, ZoneOffset): 該方法用于從嚴格模式下的本地日期時間創(chuàng)建ZonedDateTime實例。
@Test
public void test2() {ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId.getId());//輸出結果:Asia/ShanghaiZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));System.out.println(zonedDateTime);//輸出結果:2023-11-29T13:32:12+08:00[Asia/Shanghai]LocalDate localDate = LocalDate.of(2023, 11, 29);LocalTime localTime = LocalTime.of(13, 32, 12, 0);ZonedDateTime zonedDateTime1 = ZonedDateTime.of(localDate, localTime, zoneId);System.out.println(zonedDateTime1);//輸出結果:2023-11-29T13:32:12+08:00[Asia/Shanghai]
}
ZonedDateTime#from(...)
ZonedDateTime#from()?用于從其他時間單位(如 LocalDateTime, LocalDate, LocalTime, Instant 等)創(chuàng)建?ZonedDateTime?對象。這個方法接收一個 TemporalAccessor 對象,然后根據該對象的時間單位,將其轉換為?ZonedDateTime?對象。例如,如果我們有一個?OffsetDateTime?對象,我們可以使用?ZonedDateTime#from()?方法將其轉換為?ZonedDateTime?對象:
@Test
public void test3() {OffsetDateTime offsetDateTime = OffsetDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneOffset.ofHours(-5));ZonedDateTime from = ZonedDateTime.from(offsetDateTime);System.out.println(from);//輸出結果:2023-11-29T13:32:12-05:00
}
ZonedDateTime#parse(...)
ZonedDateTime#parse()?用于將字符串解析為?ZonedDateTime?對象。這個方法接受一個字符串參數,并嘗試將其解析為?
ZonedDateTime?格式。這里要特別注意:如果字符格式不符合規(guī)范,則會拋出異常;
@Test
public void test4() {String str = "2023-11-29T13:32:12+08:00[Asia/Shanghai]";ZonedDateTime zonedDateTime = ZonedDateTime.parse(str);System.out.println(zonedDateTime);//輸出結果:2023-11-29T13:32:12+08:00[Asia/Shanghai]
}
ZonedDateTime#isSupported(...)
ZonedDateTime#isSupported(...)?用于確定當前時間是否支持給定的時間字段。這個方法接受一個 TemporalField 對象作為參數,如果當前時間支持該字段,則返回 true,否則返回 false。
@Test
public void test5() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));boolean supported = zonedDateTime.isSupported(ChronoUnit.YEARS);boolean supported2 = zonedDateTime.isSupported(ChronoField.YEAR);System.out.println(supported);//輸出結果:trueSystem.out.println(supported2);//輸出結果:true
}
ZonedDateTime#range(...)
ZonedDateTime#range(...)?是 用于獲取給定時間字段的范圍。這個方法接受一個 TemporalField 對象作為參數,返回一個 TemporalRange 對象,表示該字段的范圍。
@Test
public void test6() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ValueRange range = zonedDateTime.range(ChronoField.DAY_OF_MONTH);long minimum = range.getMinimum();long maximum = range.getMaximum();System.out.println(minimum);//輸出結果:trueSystem.out.println(maximum);//輸出結果:true
}
ZonedDateTime#get(...)、ZonedDateTime#getLong(...)、ZonedDateTime#getOffset(...)
- ZonedDateTime#get(...):該方法用于從ZonedDateTime對象獲取指定字段的值。例如,調用get()方法并傳入一個表示“小時”的字段,將返回當前時間的小時值。如果查詢的字段值超出該字段的有效范圍,或者不支持該字段,可能會引發(fā)異常。
- ZonedDateTime#getLong(...):這個方法用于獲取ZonedDateTime對象中指定字段的長整型值。同樣,如果查詢的字段值超出有效范圍,或者不支持該字段,可能會引發(fā)異常。
- ZonedDateTime#getOffset(...):此方法用于獲取ZonedDateTime對象的時區(qū)偏移量。它返回一個表示偏移量的ZoneOffset對象。
這些方法都可用于處理和操作具有時區(qū)信息的時間,但get()和getLong()方法更側重于獲取時間的特定部分,而getOffset()則關注于獲取時區(qū)的偏移量。
@Test
public void test7() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));int year = zonedDateTime.get(ChronoField.YEAR);long yearOfYear = zonedDateTime.getLong(ChronoField.YEAR);int month = zonedDateTime.get(ChronoField.MONTH_OF_YEAR);int day = zonedDateTime.get(ChronoField.DAY_OF_MONTH);int dayOfYear = zonedDateTime.get(ChronoField.DAY_OF_YEAR);ZoneOffset offset = zonedDateTime.getOffset();System.out.println(year);//輸出結果:2023System.out.println(yearOfYear);//輸出結果:2023System.out.println(month);//輸出結果:11System.out.println(day);//輸出結果:29System.out.println(dayOfYear);//輸出結果:333System.out.println(offset);//輸出結果:+08:00
}
ZonedDateTime#getZone(...)
ZonedDateTime#getZone()?用于獲取該對象的時區(qū)。此方法返回一個?ZoneId?對象,表示?ZonedDateTime?對象的時區(qū)。ZoneId?是 Java 8 中表示時區(qū)的類。
@Testpublic void test8() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("America/New_York"));String zoneId = zonedDateTime.getZone().getId();System.out.println(zoneId);//輸出結果:America/New_York}
ZonedDateTime#withZoneSameLocal(...)、ZonedDateTime#withZoneSameInstant(...)、ZonedDateTime#withFixedOffsetZone(...)
- ZonedDateTime#withZoneSameLocal():用于通過更改時區(qū)來返回此ZonedDateTime對象的副本,如果可能的話不更改本地日期時間。僅當本地日期時間對于新區(qū)域無效時才更改本地日期時間。此方法盡量保持相同的本地時間,同時改變時區(qū)。
- 使用場景:當你需要確保在特定時區(qū)下的本地時間不變,而僅僅需要改變日期的表示時區(qū)時,可以使用此方法。
- ZonedDateTime#withZoneSameInstant():這個方法通過更改時區(qū)且不帶瞬時值來返回此ZonedDateTime對象的副本。換句話說,它將嘗試保持相同的時間戳,但可能在不同的時區(qū)下。當你需要確保在特定時區(qū)下的時間戳不變,而僅僅需要改變日期的表示時區(qū)時,可以使用此方法。
- ZonedDateTime#withFixedOffsetZone():這個方法允許你使用固定的偏移量來創(chuàng)建新的ZonedDateTime對象。偏移量表示從UTC(協(xié)調世界時間)到當前時區(qū)的偏移量。當你需要創(chuàng)建一個具有特定偏移量的ZonedDateTime對象,而不管具體的時區(qū)是什么時,可以使用此方法。
@Test
public void test9() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime1 = zonedDateTime.withZoneSameLocal(ZoneId.of(("America/New_York")));System.out.println(zonedDateTime1);//輸出結果:2023-11-29T13:32:12-05:00[America/New_York]ZonedDateTime zonedDateTime2 = zonedDateTime.withZoneSameInstant(ZoneId.of(("America/New_York")));System.out.println(zonedDateTime2);//輸出結果:2023-11-29T00:32:12-05:00[America/New_York]ZonedDateTime zonedDateTime3 = zonedDateTime.withFixedOffsetZone();System.out.println(zonedDateTime3);//輸出結果:2023-11-29T13:32:12+08:00
}
ZonedDateTime#toLocalDateTime(...)、ZonedDateTime#toLocalDate(...)、ZonedDateTime#toLocalTime(...)
ZonedDateTime類的toLocalDateTime()方法、toLocalDate()方法和toLocalTime()方法分別用于返回該日期時間對象的LocalDateTime部分、LocalDate部分和LocalTime部分。以下是每個方法的功能作用和使用場景:
- ZonedDateTime#toLocalDateTime():該方法返回一個與當前ZonedDateTime對象日期和時間部分相同的LocalDateTime對象。它主要用于需要同時獲取日期和時間但不需要時區(qū)和偏移量信息的情況。例如,在記錄事件發(fā)生的時間、計算時間間隔或進行日期時間運算時,可以使用該方法。
- ZonedDateTime#toLocalDate():該方法返回一個與當前ZonedDateTime對象日期部分相同的LocalDate對象。它主要用于需要獲取日期但不需要具體時間信息的情況。例如,在記錄一個事件發(fā)生的日期、計算日期間隔或進行日期運算時,可以使用該方法。
- ZonedDateTime#toLocalTime():該方法返回一個與當前ZonedDateTime對象時間部分相同的LocalTime對象。它主要用于需要獲取時間但不需要具體日期信息的情況。例如,在記錄一個事件發(fā)生的時間、計算時間間隔或進行時間運算時,可以使用該方法。
這些方法提供了一種靈活的方式來獲取和處理日期和時間的不同組成部分。通過將ZonedDateTime對象轉換為LocalDateTime、LocalDate或LocalTime對象,可以更方便地進行各種日期和時間相關的操作。
@Test
public void test10() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));LocalDateTime localDateTime = zonedDateTime.toLocalDateTime();System.out.println(localDateTime);//輸出結果:2023-11-29T13:32:12LocalDate localDate = zonedDateTime.toLocalDate();System.out.println(localDate);//輸出結果:2023-11-29LocalTime localTime = zonedDateTime.toLocalTime();System.out.println(localTime);//輸出結果:13:32:12
}
ZonedDateTime#getYear(...)、ZonedDateTime#getMonthValue(...)、ZonedDateTime#getMonth(...)、ZonedDateTime#getDayOfMonth(...)、ZonedDateTime#getDayOfYear(...)、ZonedDateTime#getDayOfWeek(...)、ZonedDateTime#getHour(...)、ZonedDateTime#getMinute(...)、ZonedDateTime#getSecond(...)、ZonedDateTime#getNano(...)
- ZonedDateTime#getYear(...):這個方法的功能是獲取年份字段。它返回該年份的原始int值。此方法返回的年份是proleptic,即根據UTC/格林威治標準時間相對應的本地日期時間與區(qū)域ID規(guī)則定義的有效偏移量來獲得。
- ZonedDateTime#getMonthValue(...):這個方法的功能是獲取月份字段的值。它返回一個表示月份的整數,范圍從1(一月)到12(十二月)。
- ZonedDateTime#getMonth(...):這個方法的功能是獲取月份字段。它返回一個表示月份的枚舉值,如JANUARY、FEBRUARY等。
- ZonedDateTime#getDayOfMonth(...):這個方法的功能是獲取一個月中的日期字段。它返回一個表示一個月中某一天的整數,范圍從1到該月的最大天數。
- ZonedDateTime#getDayOfYear(...):這個方法的功能是獲取一年中的日期字段。它返回一個表示一年中某一天的整數,范圍從1到365(或366在一些年份)。
- ZonedDateTime#getDayOfWeek(...):這個方法的功能是獲取一周中的日期字段。它返回一個表示星期幾的枚舉值,如SUNDAY、MONDAY等。
- ZonedDateTime#getHour(...):這個方法的功能是獲取小時字段。它返回一個表示小時的整數,范圍從0(午夜)到23(晚上11點)。
- ZonedDateTime#getMinute(...):這個方法的功能是獲取分鐘字段。它返回一個表示分鐘的整數,范圍從0到59。
- ZonedDateTime#getSecond(...):這個方法的功能是獲取秒字段。它返回一個表示秒數的整數,范圍從0到59。
- ZonedDateTime#getNano(...):這個方法的功能是獲取毫秒字段的一部分(即納秒)。它返回一個表示納秒數的整數,范圍從0到999999999。
這些方法的作用是根據給定的時間點獲取不同的時間單位信息。主要的使用場景:
- 獲取特定時間點的年、月、日、時、分、秒和納秒等信息。
- 在日期和時間計算中,使用這些方法來分析和操作日期和時間數據。
- 在需要精確到納秒級別的計算或記錄中,使用這些方法來獲取和操作時間信息。
@Test
public void test11() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));int year = zonedDateTime.getYear();int monthValue = zonedDateTime.getMonthValue();int dayOfMonth = zonedDateTime.getDayOfMonth();int dayOfYear = zonedDateTime.getDayOfYear();int hour = zonedDateTime.getHour();System.out.println(year);//輸出結果:2023System.out.println(monthValue);//輸出結果:11System.out.println(dayOfMonth);//輸出結果:29System.out.println(dayOfYear);//輸出結果:333System.out.println(hour);//輸出結果:13
}
ZonedDateTime#with(...)、ZonedDateTime#withYear(...)、ZonedDateTime#withMonth(...)、ZonedDateTime#withDayOfMonth(...)、ZonedDateTime#withDayOfYear(...)、ZonedDateTime#withHour(...)、ZonedDateTime#withMinute(...)、ZonedDateTime#withSecond(...)、ZonedDateTime#withNano(...)
- ZonedDateTime#with(TemporalAdjuster adjuster):該方法允許您使用指定的調整器對象對日期/時間進行調整。這可以用于執(zhí)行各種日期/時間相關的操作,例如更改日期、時間或時區(qū)等。返回的是一個新的ZonedDateTime對象,它是原始對象的副本,不會影響原始對象。
- ZonedDateTime#withYear(int year):這個方法用于更改ZonedDateTime中的年份。它返回一個新的ZonedDateTime對象,其中包含更改后的年份和原始的月份、日期、小時、分鐘、秒和納秒。此方法在本地時間軸上操作,更改本地日期時間的年份以及此操作之后的本地日期時間使用區(qū)域ID獲取偏移量,將其轉換回ZonedDateTime。當轉換回ZonedDateTime時,如果本地日期時間重疊,則將盡可能保留偏移量,否則將使用較早的偏移量。
- ZonedDateTime#withMonth(int month):這個方法用于更改ZonedDateTime中的月份。它返回一個新的ZonedDateTime對象,其中包含更改后的月份和原始的年份、日期、小時、分鐘、秒和納秒。
- ZonedDateTime#withDayOfMonth(int dayOfMonth):這個方法用于更改ZonedDateTime中的日期。它返回一個新的ZonedDateTime對象,其中包含更改后的日期和原始的年份、月份、小時、分鐘、秒和納秒。
- ZonedDateTime#withDayOfYear(int dayOfYear):這個方法用于更改ZonedDateTime中的一年中的日期。它返回一個新的ZonedDateTime對象,其中包含更改后的日期和原始的年份、月份、小時、分鐘、秒和納秒。
- ZonedDateTime#withHour(int hour):這個方法用于更改ZonedDateTime中的小時。它返回一個新的ZonedDateTime對象,其中包含更改后的小時和原始的年份、月份、日期、分鐘、秒和納秒。
- ZonedDateTime#withMinute(int minute):這個方法用于更改ZonedDateTime中的分鐘。它返回一個新的ZonedDateTime對象,其中包含更改后的分鐘和原始的年份、月份、日期、小時、秒和納秒。
- ZonedDateTime#withSecond(int second):這個方法用于更改ZonedDateTime中的秒數。它返回一個新的ZonedDateTime對象,其中包含更改后的秒數和原始的年份、月份、日期、小時、分鐘和納秒。
- ZonedDateTime#withNano(int nano):這個方法用于更改ZonedDateTime中的納秒數。它返回一個新的ZonedDateTime對象,其中包含更改后的納秒數和原始的年份、月份、日期、小時、分鐘和秒。
這些方法的使用場景包括但不限于以下情況:
- 在需要對日期/時間進行精細操作或調整時,例如更改年、月、日等字段或執(zhí)行更復雜的日期/時間計算時,可以使用這些方法。
- 在需要創(chuàng)建具有特定日期/時間信息的副本或新的日期/時間對象時,可以使用這些方法。
- 在需要進行時區(qū)轉換或處理時,可以使用這些方法來獲取特定時區(qū)下的日期/時間信息。
@Test
public void test12() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime1 = zonedDateTime.with(ChronoField.YEAR, 2022);System.out.println(zonedDateTime1);//輸出結果2022-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime2 = zonedDateTime.withYear(2022);System.out.println(zonedDateTime2);//輸出結果2022-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime3 = zonedDateTime.with(ChronoField.DAY_OF_MONTH, 1);System.out.println(zonedDateTime3);//輸出結果2023-11-01T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime4 = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 1);System.out.println(zonedDateTime4);//輸出結果:2023-11-29T01:32:12+08:00[Asia/Shanghai]
}
ZonedDateTime#truncatedTo(...)
ZonedDateTime#truncatedTo(TemporalUnit unit)?的主要作用是將當前的ZonedDateTime對象截斷到給定的時間單位,并返回一個新的ZonedDateTime對象。具體來說,這個方法接受一個?TemporalUnit?參數,該參數表示要截斷的時間單位??赡艿闹蛋?DAYS、HOURS、MICROSECONDS、MILLISECONDS、MINUTES、NANOSECONDS、SECONDS?等。這個方法將忽略時間單位比指定單位更小的時間單位,例如,如果將日期時間截斷到分鐘,那么該方法將忽略秒和毫秒字段。
@Test
public void test13() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime1 = zonedDateTime.truncatedTo(ChronoUnit.DAYS);System.out.println(zonedDateTime1);//輸出結果:2023-11-29T00:00+08:00[Asia/Shanghai]
}
ZonedDateTime#plus(...)、ZonedDateTime#plusYears(...)、ZonedDateTime#plusMonths(...)、ZonedDateTime#plusWeeks(...)、ZonedDateTime#plusDays(...)、ZonedDateTime#plusHours(...)、ZonedDateTime#plusMinutes(...)、ZonedDateTime#plusSeconds(...)、ZonedDateTime#plusNanos(...)
- ZonedDateTime#plus(...):此方法用于返回此日期時間的副本,其中添加了指定的單位數量。它接受兩個參數:amountToAdd(要添加到結果中的單位數量,可能為負)和unit(要添加數量的單位)。返回值是根據此日期時間返回的ZonedDateTime,并添加了指定的數量。該數量通常為Period或Duration,但可以是實現(xiàn)TemporalAmount接口的任何其他類型。當由于不支持該單位或由于其他原因而無法添加數量時,會拋出異常。
- ZonedDateTime#plusYears(...):此方法用于在此ZonedDateTime中添加年數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusMonths(...):此方法用于在此ZonedDateTime中添加月數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusWeeks(...):此方法用于在此ZonedDateTime中添加周數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusDays(...):此方法用于在此ZonedDateTime中添加天數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusHours(...):此方法用于在此ZonedDateTime中添加小時數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusMinutes(...):此方法用于在此ZonedDateTime中添加分鐘數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusSeconds(...):此方法用于在此ZonedDateTime中添加秒數,并在添加后返回ZonedDateTime的副本。
- ZonedDateTime#plusNanos(...):此方法用于在此ZonedDateTime中添加納秒數,并在添加后返回ZonedDateTime的副本。
@Test
public void test14() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime1 = zonedDateTime.plus(1, ChronoUnit.YEARS);System.out.println(zonedDateTime1);//輸出結果:2024-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime2 = zonedDateTime.plusYears(1);System.out.println(zonedDateTime2);//輸出結果:2024-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime3 = zonedDateTime.plusMonths(1);System.out.println(zonedDateTime3);//輸出結果:2023-12-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime4 = zonedDateTime.plusDays(1);System.out.println(zonedDateTime4);//輸出結果:2023-11-30T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime5 = zonedDateTime.plusMinutes(28);System.out.println(zonedDateTime5); //輸出結果:2023-11-29T14:00:12+08:00[Asia/Shanghai]
}
ZonedDateTime#minus(...)、ZonedDateTime#minusYears(...)、ZonedDateTime#minusMonths(...)、ZonedDateTime#minusWeeks(...)、ZonedDateTime#minusDays(...)、ZonedDateTime#minusHours(...)、ZonedDateTime#minusMinutes(...)、ZonedDateTime#minusSeconds(...)、ZonedDateTime#minusNanos(...)
- ZonedDateTime#minus(...):此方法用于返回此日期時間的副本,其中減去指定的單位數量。它接受兩個參數:amountToSubtract表示要減去的單位量,可能為負數;unit表示要減去的量的單位。此方法基于本地時間軸進行操作,將本地日期時間減去指定的年、月、日、時、分、秒和納秒等單位。使用此方法時,需要確保減去的結果在支持的日期范圍內,否則可能會拋出異常。
- ZonedDateTime#minusYears(...):此方法用于從當前日期時間減去指定數量的年份。它接受一個表示年份的參數,該參數可以是負數。此方法在本地時間軸上操作,將從本地日期時間中減去年份,并使用區(qū)域ID獲取偏移量。當轉換回ZonedDateTime時,如果本地日期時間重疊,將盡可能保留偏移量,否則將使用較早的偏移量。此實例是不可變的,不受此方法調用的影響。
- ZonedDateTime#minusMonths(...):此方法用于從當前日期時間減去指定數量的月份。它接受一個表示月份的參數。此方法在本地時間軸上操作,將從本地日期時間中減去月份。
- ZonedDateTime#minusWeeks(...):此方法用于從當前日期時間減去指定數量的周數。它接受一個表示周數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去周數。
- ZonedDateTime#minusDays(...):此方法用于從當前日期時間減去指定數量的天數。它接受一個表示天數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去天數。
- ZonedDateTime#minusHours(...):此方法用于從當前日期時間減去指定的小時數。它接受一個表示小時數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去小時數。
- ZonedDateTime#minusMinutes(...):此方法用于從當前日期時間減去指定的分鐘數。它接受一個表示分鐘數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去分鐘數。
- ZonedDateTime#minusSeconds(...):此方法用于從當前日期時間減去指定的秒數。它接受一個表示秒數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去秒數。
- ZonedDateTime#minusNanos(...):此方法用于從當前日期時間減去指定的納秒數。它接受一個表示納秒數的參數。此方法在本地時間軸上操作,將從本地日期時間中減去納秒數。
@Test
public void test15() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime1 = zonedDateTime.minus(1, ChronoUnit.YEARS);System.out.println(zonedDateTime1);//輸出結果:2022-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime2 = zonedDateTime.minusYears(1);System.out.println(zonedDateTime2);//輸出結果:2022-11-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime3 = zonedDateTime.minusMonths(1);System.out.println(zonedDateTime3);//輸出結果:2023-10-29T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime4 = zonedDateTime.minusDays(1);System.out.println(zonedDateTime4);//輸出結果:2023-11-28T13:32:12+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime5 = zonedDateTime.minusMinutes(28);System.out.println(zonedDateTime5); //輸出結果:2023-11-29T13:04:12+08:00[Asia/Shanghai]
}
ZonedDateTime#query(...)
ZonedDateTime#query(...)?用于查詢與當前?ZonedDateTime?對象相關的信息。該方法接受一個?TemporalQuery?參數,用于指定要查詢的信息類型。TemporalQuery?是一個函數式接口,用于從給定的時間對象中提取所需的信息。
@Test
public void test16() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));TemporalQuery<Integer> temporalQuery=item->item.get(ChronoField.DAY_OF_YEAR);Integer dayOfYear = zonedDateTime.query(temporalQuery);System.out.println(dayOfYear); //輸出結果:333
}
ZonedDateTime#until(...)
ZonedDateTime#until(ZonedDateTime)?用于根據單個TemporalUnit計算兩個日期時間之間的時間差。
@Test
public void test17() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2022, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));ZonedDateTime zonedDateTime2 = ZonedDateTime.of(2023, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));long until = zonedDateTime.until(zonedDateTime2, ChronoUnit.MONTHS);System.out.println(until); //輸出結果:12
}
ZonedDateTime#format(...)
ZonedDateTime#format()?用于將當前對象的時間信息按照指定的格式進行格式化,并返回一個字符串表示。該方法接受一個DateTimeFormatter?參數,用于指定日期時間的格式。
@Test
public void test18() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2022, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));String format = zonedDateTime.format(DateTimeFormatter.ISO_DATE);System.out.println(format); //輸出結果:2022-11-29+08:00
}
ZonedDateTime#toOffsetDateTime(...)
ZonedDateTime#toOffsetDateTime()?用于將當前對象轉換為一個?OffsetDateTime?對象。OffsetDateTime?是 Java 中的一個日期時間類,它表示一個帶有時間偏移量的日期時間,通常用于處理具有不同時區(qū)的日期時間。
ZonedDateTime?對象表示一個具有時區(qū)的日期時間,而?OffsetDateTime?對象則表示一個具有時間偏移量的日期時間。因此,通過調用?toOffsetDateTime()?方法,可以將?ZonedDateTime?對象轉換為一個?OffsetDateTime?對象,以便進行進一步的處理或操作。
@Test
public void test19() {ZonedDateTime zonedDateTime = ZonedDateTime.of(2022, 11, 29, 13, 32, 12, 0, ZoneId.of("Asia/Shanghai"));OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();System.out.println(offsetDateTime); //輸出結果:2022-11-29T13:32:12+08:00
}
使用場景
ZonedDateTime常用于表示帶有時區(qū)的日期和時間,它的使用場景包括但不限于:
- 處理具有不同時區(qū)的日期時間:由于地球是圓形的,不同地理位置處于不同的時區(qū),因此需要在處理日期時間時考慮時區(qū)差異。ZonedDateTime可以用于表示帶有時區(qū)的日期和時間,并能夠根據時區(qū)進行轉換和處理。
- 日程安排和時間規(guī)劃:在日程安排和時間規(guī)劃中,需要考慮不同時區(qū)的時間差異。ZonedDateTime可以用于表示會議、活動等的時間和地點,并能夠根據參與者所在的時區(qū)進行自動轉換。
- 全球化應用:隨著全球化的發(fā)展,跨時區(qū)的交流和合作變得越來越普遍。ZonedDateTime可以用于表示全球范圍內的日期和時間,并能夠根據不同時區(qū)進行格式化和顯示。
- 系統(tǒng)集成和數據交換:在企業(yè)級應用和系統(tǒng)集成中,不同系統(tǒng)之間可能存在時區(qū)差異。ZonedDateTime可以用于表示系統(tǒng)之間的日期和時間,并能夠根據需要進行轉換和處理。
總結
與OffsetDateTime的區(qū)別
ZonedDateTime與OffsetDateTime的區(qū)別主要包括以下幾個方面:
- 時區(qū)信息:ZonedDateTime包含時區(qū)信息,可能包含城市或地區(qū)的信息,而OffsetDateTime只包含時差信息,不包含城市或地區(qū)的信息。
- 創(chuàng)建方式:創(chuàng)建ZonedDateTime和OffsetDateTime類的對象通常通過now()和of()這兩個方法完成。通過now()方法所創(chuàng)建的對象表示系統(tǒng)當前的日期時間。而如果通過of()方法創(chuàng)建對象,需要給of()方法傳遞3部分信息,分別是:日期、時間以及時區(qū)。在表示日期時間的參數方面,ZonedDateTime的of()方法的表示時區(qū)的參數是ZoneId類型,因此用ZoneRegion類對象和ZoneOffset類對象都可以充當這個參數,而OffsetDateTime的of()方法表示時區(qū)的參數類型是ZoneOffset,因此僅能用該類型的對象充當參數。
- 存儲信息:ZonedDateTime類對象中包含localdatetime、zoneid和已解析的zoneoffset三個獨立對象的狀態(tài),而OffsetDateTime類對象只包含日期和時間字段,以及與GMT/UTC的偏移量。
綜上所述,ZonedDateTime和OffsetDateTime都是Java 8中表示日期時間的類,它們在處理日期和時間方面有所不同。ZonedDateTime更適用于處理具有時區(qū)信息的日期和時間,而OffsetDateTime則更適用于處理具有偏移量信息的日期和時間。
與LocalDateTime的區(qū)別
ZonedDateTime與LocalDateTime的主要區(qū)別體現(xiàn)在以下方面:
- 時區(qū)信息:ZonedDateTime包含時區(qū)信息,表示一個具有特定時區(qū)的日期和時間,而LocalDateTime則沒有時區(qū)信息,它表示的是一個相對獨立的日期和時間。
- 創(chuàng)建方式:創(chuàng)建ZonedDateTime和LocalDateTime類的對象通常是通過now()和of()這兩個方法完成的。通過now()方法所創(chuàng)建的對象表示系統(tǒng)當前的日期時間。而如果通過of()方法創(chuàng)建對象,需要給of()方法傳遞3部分信息,分別是:日期、時間以及時區(qū)。
- 應用場景:ZonedDateTime更適用于處理具有時區(qū)信息的日期和時間,而LocalDateTime則更適用于處理具有偏移量信息的日期和時間。
- 不可變性:ZonedDateTime是不可變的,即一旦創(chuàng)建了ZonedDateTime對象,其日期和時間信息就不能再被修改。這種不可變性使得ZonedDateTime對象是線程安全的。而LocalDateTime也是不可變的,它同樣具有線程安全的特點。
總的來說,ZonedDateTime和LocalDateTime類都是Java 8中表示日期和時間的工具,它們都不可變且線程安全。然而,ZonedDateTime更注重時區(qū)信息的處理,而LocalDateTime則不具備這種能力。