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