詳解LocalDateTime、OffsetDateTime、ZonedDateTime互轉(zhuǎn),這一篇絕對(duì)喂飽你
你好,我是A哥(YourBatman)。
在JSR 310日期時(shí)間體系了,一共有三個(gè)API可用于表示日期時(shí)間:
- LocalDateTime:本地日期時(shí)間
- OffsetDateTime:帶偏移量的日期時(shí)間
- ZonedDateTime:帶時(shí)區(qū)的日期時(shí)間
也許平時(shí)開(kāi)發(fā)中你只用到過(guò)LocalDateTime這個(gè)API,那是極好的,但是不能止步于此,否則就圖樣圖森破了。
隨著場(chǎng)景的多樣性變化,咱們開(kāi)發(fā)者接觸到OffsetDateTime/ZonedDateTime的概率越來(lái)越大,但凡和國(guó)際化產(chǎn)生上關(guān)系的大概率都會(huì)用得到它們。本文依然站在實(shí)用的角度,輔以具體代碼示例,介紹它三。
本文提綱

版本約定
JDK:8
正文
下面這張圖是一個(gè)完整的日期時(shí)間,拆解各個(gè)部分的含義,一目了然(建議收藏此圖):

因?yàn)長(zhǎng)ocalDate、LocalTime等理解起來(lái)比較簡(jiǎn)單,就不用再花筆墨介紹了,重點(diǎn)放在LocalDateTime、OffsetDateTime、ZonedDateTime它三身上。
什么是LocalDateTime?

ISO-8601日歷系統(tǒng)中不帶時(shí)區(qū)的日期時(shí)間。
- ❝說(shuō)明:ISO-8601日系統(tǒng)是現(xiàn)今世界上絕大部分國(guó)家/地區(qū)使用的,這就是我們國(guó)人所說(shuō)的公歷,有閏年的特性❞
LocalDateTime是一個(gè)不可變的日期-時(shí)間對(duì)象,它表示一個(gè)日期時(shí)間,通常被視為年-月-日-小時(shí)-分鐘-秒。還可以訪問(wèn)其他日期和時(shí)間字段,如day-of-year、day-of-week和week-of-year等等,它的精度能達(dá)納秒級(jí)別。
該類不存儲(chǔ)時(shí)區(qū),所以適合日期的描述,比如用于生日、deadline等等。但是請(qǐng)記住,如果沒(méi)有偏移量/時(shí)區(qū)等附加信息,一個(gè)時(shí)間是不能表示時(shí)間線上的某一時(shí)刻的。
代碼示例
最大/最小值:
- @Test
- public void test1() {
- LocalDateTime min = LocalDateTime.MIN;
- LocalDateTime max = LocalDateTime.MAX;
- System.out.println("LocalDateTime最小值:" + min);
- System.out.println("LocalDateTime最大值:" + max);
- System.out.println(min.getYear() + "-" + min.getMonthValue() + "-" + min.getDayOfMonth());
- System.out.println(max.getYear() + "-" + max.getMonthValue() + "-" + max.getDayOfMonth());
- }
- 輸出:
- LocalDateTime最小值:-999999999-01-01T00:00
- LocalDateTime最大值:+999999999-12-31T23:59:59.999999999
- -999999999-1-1
- 999999999-12-31
構(gòu)造:
- @Test
- public void test2() {
- System.out.println("當(dāng)前時(shí)區(qū)的本地時(shí)間:" + LocalDateTime.now());
- System.out.println("當(dāng)前時(shí)區(qū)的本地時(shí)間:" + LocalDateTime.of(LocalDate.now(), LocalTime.now()));
- System.out.println("紐約時(shí)區(qū)的本地時(shí)間:" + LocalDateTime.now(ZoneId.of("America/New_York")));
- }
- 輸出:
- 當(dāng)前時(shí)區(qū)的本地時(shí)間:2021-01-17T17:00:41.446
- 當(dāng)前時(shí)區(qū)的本地時(shí)間:2021-01-17T17:00:41.447
- 紐約時(shí)區(qū)的本地時(shí)間:2021-01-17T04:00:41.450
注意,最后一個(gè)構(gòu)造傳入了ZoneId,并不是說(shuō)LocalDateTime和時(shí)區(qū)有關(guān)了,而是告訴說(shuō)這個(gè)Local指的是紐約,細(xì)品這句話。
計(jì)算:
- @Test
- public void test3() {
- LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
- System.out.println("計(jì)算前:" + now);
- // 加3天
- LocalDateTime after = now.plusDays(3);
- // 減4個(gè)小時(shí)
- after = after.plusHours(-3); // 效果同now.minusDays(3);
- System.out.println("計(jì)算后:" + after);
- // 計(jì)算時(shí)間差
- Period period = Period.between(now.toLocalDate(), after.toLocalDate());
- System.out.println("相差天數(shù):" + period.getDays());
- Duration duration = Duration.between(now.toLocalTime(), after.toLocalTime());
- System.out.println("相差小時(shí)數(shù):" + duration.toHours());
- }
- 輸出:
- 計(jì)算前:2021-01-17T17:10:15.381
- 計(jì)算后:2021-01-20T14:10:15.381
- 相差天數(shù):3
- 相差小時(shí)數(shù):-3
格式化:
- @Test
- public void test4() {
- LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
- // System.out.println("格式化輸出:" + DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(now));
- System.out.println("格式化輸出(本地化輸出,中文環(huán)境):" + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT).format(now));
- String dateTimeStrParam = "2021-01-17 18:00:00";
- System.out.println("解析后輸出:" + LocalDateTime.parse(dateTimeStrParam, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US)));
- }
- 輸出:
- 格式化輸出(本地化輸出,中文環(huán)境):21-1-17 下午5:15
- 解析后輸出:2021-01-17T18:00
什么是OffsetDateTime?

ISO-8601日歷系統(tǒng)中與UTC偏移量有關(guān)的日期時(shí)間。OffsetDateTime是一個(gè)帶有偏移量的日期時(shí)間類型。存儲(chǔ)有精確到納秒的日期時(shí)間,以及偏移量。可以簡(jiǎn)單理解為 OffsetDateTime = LocalDateTime + ZoneOffset。

OffsetDateTime、ZonedDateTime和Instant它們?nèi)寄茉跁r(shí)間線上以納秒精度存儲(chǔ)一個(gè)瞬間(請(qǐng)注意:LocalDateTime是不行的),也可理解我某個(gè)時(shí)刻。OffsetDateTime和Instant可用于模型的字段類型,因?yàn)樗鼈兌急硎舅查g值并且還不可變,所以適合網(wǎng)絡(luò)傳輸或者數(shù)據(jù)庫(kù)持久化。
- ❝ZonedDateTime不適合網(wǎng)絡(luò)傳輸/持久化,因?yàn)榧词雇粋€(gè)ZoneId時(shí)區(qū),不同地方獲取到瞬時(shí)值也有可能不一樣❞
代碼示例
最大/最小值:
- @Test
- public void test5() {
- OffsetDateTime min = OffsetDateTime.MIN;
- OffsetDateTime max = OffsetDateTime.MAX;
- System.out.println("OffsetDateTime最小值:" + min);
- System.out.println("OffsetDateTime最大值:" + max);
- System.out.println(min.getOffset() + ":" + min.getYear() + "-" + min.getMonthValue() + "-" + min.getDayOfMonth());
- System.out.println(max.getOffset() + ":" + max.getYear() + "-" + max.getMonthValue() + "-" + max.getDayOfMonth());
- }
- 輸出:
- OffsetDateTime最小值:-999999999-01-01T00:00+18:00
- OffsetDateTime最大值:+999999999-12-31T23:59:59.999999999-18:00
- +18:00:-999999999-1-1
- -18:00:999999999-12-31
偏移量的最大值是+18,最小值是-18,這是由ZoneOffset內(nèi)部的限制決定的。
構(gòu)造:
- @Test
- public void test6() {
- System.out.println("當(dāng)前位置偏移量的本地時(shí)間:" + OffsetDateTime.now());
- System.out.println("偏移量-4(紐約)的本地時(shí)間::" + OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.of("-4")));
- System.out.println("紐約時(shí)區(qū)的本地時(shí)間:" + OffsetDateTime.now(ZoneId.of("America/New_York")));
- }
- 輸出:
- 當(dāng)前位置偏移量的本地時(shí)間:2021-01-17T19:02:06.328+08:00
- 偏移量-4(紐約)的本地時(shí)間::2021-01-17T19:02:06.329-04:00
- 紐約時(shí)區(qū)的本地時(shí)間:2021-01-17T06:02:06.330-05:00
計(jì)算:略
格式化:
- @Test
- public void test7() {
- OffsetDateTime now = OffsetDateTime.now(ZoneId.systemDefault());
- System.out.println("格式化輸出(本地化輸出,中文環(huán)境):" + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT).format(now));
- String dateTimeStrParam = "2021-01-17T18:00:00+07:00";
- System.out.println("解析后輸出:" + OffsetDateTime.parse(dateTimeStrParam));
- }
- 輸出:
- 格式化輸出(本地化輸出,中文環(huán)境):21-1-17 下午7:06
- 解析后輸出:2021-01-17T18:00+07:00
轉(zhuǎn)換:LocalDateTime -> OffsetDateTime
- @Test
- public void test8() {
- LocalDateTime localDateTime = LocalDateTime.of(2021, 01, 17, 18, 00, 00);
- System.out.println("當(dāng)前時(shí)區(qū)(北京)時(shí)間為:" + localDateTime);
- // 轉(zhuǎn)換為偏移量為 -4的OffsetDateTime時(shí)間
- // 1、-4地方的晚上18點(diǎn)
- System.out.println("-4偏移量地方的晚上18點(diǎn):" + OffsetDateTime.of(localDateTime, ZoneOffset.ofHours(-4)));
- System.out.println("-4偏移量地方的晚上18點(diǎn)(方式二):" + localDateTime.atOffset(ZoneOffset.ofHours(-4)));
- // 2、北京時(shí)間晚上18:00 對(duì)應(yīng)的-4地方的時(shí)間點(diǎn)
- System.out.println("當(dāng)前地區(qū)對(duì)應(yīng)的-4地方的時(shí)間:" + OffsetDateTime.ofInstant(localDateTime.toInstant(ZoneOffset.ofHours(8)), ZoneOffset.ofHours(-4)));
- }
- 輸出:
- 當(dāng)前時(shí)區(qū)(北京)時(shí)間為:2021-01-17T18:00
- -4偏移量地方的晚上18點(diǎn):2021-01-17T18:00-04:00
- -4偏移量地方的晚上18點(diǎn)(方式二):2021-01-17T18:00-04:00
- 當(dāng)前地區(qū)對(duì)應(yīng)的-4地方的時(shí)間:2021-01-17T06:00-04:00
通過(guò)此例值得注意的是:LocalDateTime#atOffset()/atZone()只是增加了偏移量/時(shí)區(qū),本地時(shí)間是并沒(méi)有改變的。若想實(shí)現(xiàn)本地時(shí)間到其它偏移量的對(duì)應(yīng)的時(shí)間只能通過(guò)其ofInstant()系列構(gòu)造方法。
OffsetDateTime -> LocalDateTime
- @Test
- public void test81() {
- OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.ofHours(-4));
- System.out.println("-4偏移量時(shí)間為:" + offsetDateTime);
- // 轉(zhuǎn)為L(zhǎng)ocalDateTime 注意:時(shí)間還是未變的哦
- System.out.println("LocalDateTime的表示形式:" + offsetDateTime.toLocalDateTime());
- }
- 輸出:
- -4偏移量時(shí)間為:2021-01-17T19:33:28.139-04:00
- LocalDateTime的表示形式:2021-01-17T19:33:28.139
什么是ZonedDateTime?

ISO-8601國(guó)際標(biāo)準(zhǔn)日歷系統(tǒng)中帶有時(shí)區(qū)的日期時(shí)間。它存儲(chǔ)所有的日期和時(shí)間字段,精度為納秒,以及一個(gè)時(shí)區(qū),帶有用于處理不明確的本地日期時(shí)間的時(shí)區(qū)偏移量。
這個(gè)API可以處理從LocalDateTime -> Instant -> ZonedDateTime的轉(zhuǎn)換,其中用zone時(shí)區(qū)來(lái)表示偏移量(并非直接用offset哦)。兩個(gè)時(shí)間點(diǎn)之間的轉(zhuǎn)換會(huì)涉及到使用從ZoneId訪問(wèn)的規(guī)則計(jì)算偏移量(換句話說(shuō):偏移量并非寫(xiě)死而是根據(jù)規(guī)則計(jì)算出來(lái)的)。
獲取瞬間的偏移量很簡(jiǎn)單,因?yàn)槊總€(gè)瞬間只有一個(gè)有效的偏移量。但是,獲取本地日期時(shí)間的偏移量并不簡(jiǎn)單。存在這三種情況:
- 正常情況:有一個(gè)有效的偏移量。對(duì)于一年中的絕大多數(shù)時(shí)間,適用正常情況,即本地日期時(shí)間只有一個(gè)有效的偏移量
- 時(shí)間間隙情況:沒(méi)有有效偏移量。這是由于夏令時(shí)開(kāi)始時(shí)從“冬季”改為“夏季”而導(dǎo)致時(shí)鐘向前撥的時(shí)候。在間隙中,沒(méi)有有效偏移量
- 重疊情況:有兩個(gè)有效偏移量。這是由于秋季夏令時(shí)從“夏季”到“冬季”的變化,時(shí)鐘會(huì)向后撥。在重疊部分中,有兩個(gè)有效偏移量
這三種情況如果要自己處理,估計(jì)頭都大了。這就是使用JSR 310的優(yōu)勢(shì),ZonedDateTime全幫你搞定,讓你使用無(wú)憂。
ZonedDateTime可簡(jiǎn)單認(rèn)為是LocalDateTime和ZoneId的組合。而ZoneOffset是其內(nèi)置的動(dòng)態(tài)計(jì)算出來(lái)的一個(gè)次要信息,以確保輸出一個(gè)瞬時(shí)值而存在,畢竟在某個(gè)瞬間偏移量ZoneOffset肯定是確定的。ZonedDateTime也可以理解為保存的狀態(tài)相當(dāng)于三個(gè)獨(dú)立的對(duì)象:LocalDateTime、ZoneId和ZoneOffset。某個(gè)瞬間 = LocalDateTime + ZoneOffset。ZoneId確定了偏移量如何改變的規(guī)則。所以偏移量我們并不能自由設(shè)置(不提供set方法,構(gòu)造時(shí)也不行),因?yàn)樗蒢oneId來(lái)控制的。

代碼示例
構(gòu)造:
- @Test
- public void test9() {
- System.out.println("當(dāng)前位置偏移量的本地時(shí)間:" + ZonedDateTime.now());
- System.out.println("紐約時(shí)區(qū)的本地時(shí)間:" + ZonedDateTime.of(LocalDateTime.now(), ZoneId.of("America/New_York")));
- System.out.println("北京實(shí)現(xiàn)對(duì)應(yīng)的紐約時(shí)區(qū)的本地時(shí)間:" + ZonedDateTime.now(ZoneId.of("America/New_York")));
- }
- 輸出:
- 當(dāng)前位置偏移量的本地時(shí)間:2021-01-17T19:25:10.520+08:00[Asia/Shanghai]
- 紐約時(shí)區(qū)的本地時(shí)間:2021-01-17T19:25:10.521-05:00[America/New_York]
- 北京實(shí)現(xiàn)對(duì)應(yīng)的紐約時(shí)區(qū)的本地時(shí)間:2021-01-17T06:25:10.528-05:00[America/New_York]
計(jì)算:略
格式化:略
轉(zhuǎn)換:LocalDateTime -> ZonedDateTime
- @Test
- public void test10() {
- LocalDateTime localDateTime = LocalDateTime.of(2021, 01, 17, 18, 00, 00);
- System.out.println("當(dāng)前時(shí)區(qū)(北京)時(shí)間為:" + localDateTime);
- // 轉(zhuǎn)換為偏移量為 -4的OffsetDateTime時(shí)間
- // 1、-4地方的晚上18點(diǎn)
- System.out.println("紐約時(shí)區(qū)晚上18點(diǎn):" + ZonedDateTime.of(localDateTime, ZoneId.of("America/New_York")));
- System.out.println("紐約時(shí)區(qū)晚上18點(diǎn)(方式二):" + localDateTime.atZone(ZoneId.of("America/New_York")));
- // 2、北京時(shí)間晚上18:00 對(duì)應(yīng)的-4地方的時(shí)間點(diǎn)
- System.out.println("北京地區(qū)此時(shí)間對(duì)應(yīng)的紐約的時(shí)間:" + ZonedDateTime.ofInstant(localDateTime.toInstant(ZoneOffset.ofHours(8)), ZoneOffset.ofHours(-4)));
- System.out.println("北京地區(qū)此時(shí)間對(duì)應(yīng)的紐約的時(shí)間:" + ZonedDateTime.ofInstant(localDateTime, ZoneOffset.ofHours(8), ZoneOffset.ofHours(-4)));
- }
- 輸出:
- 當(dāng)前時(shí)區(qū)(北京)時(shí)間為:2021-01-17T18:00
- 紐約時(shí)區(qū)晚上18點(diǎn):2021-01-17T18:00-05:00[America/New_York]
- 紐約時(shí)區(qū)晚上18點(diǎn)(方式二):2021-01-17T18:00-05:00[America/New_York]
- 北京地區(qū)此時(shí)間對(duì)應(yīng)的紐約的時(shí)間:2021-01-17T06:00-04:00
- 北京地區(qū)此時(shí)間對(duì)應(yīng)的紐約的時(shí)間:2021-01-17T06:00-04:00
OffsetDateTime -> ZonedDateTime
- @Test
- public void test101() {
- OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.ofHours(-4));
- System.out.println("-4偏移量時(shí)間為:" + offsetDateTime);
- // 轉(zhuǎn)換為ZonedDateTime的表示形式
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.toZonedDateTime());
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.atZoneSameInstant(ZoneId.of("America/New_York")));
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.atZoneSimilarLocal(ZoneId.of("America/New_York")));
- }
- -4偏移量時(shí)間為:2021-01-17T19:43:28.320-04:00
- ZonedDateTime的表示形式:2021-01-17T19:43:28.320-04:00
- ZonedDateTime的表示形式:2021-01-17T18:43:28.320-05:00[America/New_York]
- ZonedDateTime的表示形式:2021-01-17T19:43:28.320-05:00[America/New_York]
本例有值得關(guān)注的點(diǎn):
- atZoneSameInstant():將此日期時(shí)間與時(shí)區(qū)結(jié)合起來(lái)創(chuàng)建ZonedDateTime,以確保結(jié)果具有相同的Instant
所有偏移量-4 -> -5,時(shí)間點(diǎn)也從19 -> 18,確保了Instant保持一致嘛
- atZoneSimilarLocal:將此日期時(shí)間與時(shí)區(qū)結(jié)合起來(lái)創(chuàng)建ZonedDateTime,以確保結(jié)果具有相同的本地時(shí)間
所以直接效果和toLocalDateTime()是一樣的,但是它會(huì)盡可能的保留偏移量(所以你看-4變?yōu)榱?5,保持了真實(shí)的偏移量)
我這里貼出紐約2021年的夏令時(shí)時(shí)間區(qū)間:

也就是說(shuō)在2021.03.14 - 2021.11.07期間,紐約的偏移量是-4,其余時(shí)候是-5。那么再看這個(gè)例子(我把時(shí)間改為5月5號(hào),也就是處于夏令營(yíng)期間):
- @Test
- public void test101() {
- OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.of(2021, 05, 05, 18, 00, 00), ZoneOffset.ofHours(-4));
- System.out.println("-4偏移量時(shí)間為:" + offsetDateTime);
- // 轉(zhuǎn)換為ZonedDateTime的表示形式
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.toZonedDateTime());
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.atZoneSameInstant(ZoneId.of("America/New_York")));
- System.out.println("ZonedDateTime的表示形式:" + offsetDateTime.atZoneSimilarLocal(ZoneId.of("America/New_York")));
- }
- 輸出:
- -4偏移量時(shí)間為:2021-05-05T18:00-04:00
- ZonedDateTime的表示形式:2021-05-05T18:00-04:00
- ZonedDateTime的表示形式:2021-05-05T18:00-04:00[America/New_York]
- ZonedDateTime的表示形式:2021-05-05T18:00-04:00[America/New_York]
看到了吧,偏移量變?yōu)榱?4。感受到夏令時(shí)的“威力”了吧。
OffsetDateTime和ZonedDateTime的區(qū)別
LocalDateTime、OffsetDateTime、ZonedDateTime這三個(gè)哥們,LocalDateTime好理解,一般都沒(méi)有異議。但是很多同學(xué)對(duì)OffsetDateTime和ZonedDateTime傻傻分不清,這里說(shuō)說(shuō)它倆的區(qū)別。
- OffsetDateTime = LocalDateTime + 偏移量ZoneOffset;ZonedDateTime = LocalDateTime + 時(shí)區(qū)ZoneId
- OffsetDateTime可以隨意設(shè)置偏移值,但ZonedDateTime無(wú)法自由設(shè)置偏移值,因?yàn)榇酥凳怯蓵r(shí)區(qū)ZoneId控制的
- OffsetDateTime無(wú)法支持夏令時(shí)等規(guī)則,但ZonedDateTime可以很好的處理夏令時(shí)調(diào)整
- OffsetDateTime得益于不變性一般用于數(shù)據(jù)庫(kù)存儲(chǔ)、網(wǎng)絡(luò)通信;而ZonedDateTime得益于其時(shí)區(qū)特性,一般在指定時(shí)區(qū)里顯示時(shí)間非常方便,無(wú)需認(rèn)為干預(yù)規(guī)則
- OffsetDateTime代表一個(gè)瞬時(shí)值,而ZonedDateTime的值是不穩(wěn)定的,需要在某個(gè)瞬時(shí)根據(jù)當(dāng)時(shí)的規(guī)則計(jì)算出來(lái)偏移量從而確定實(shí)際值
總的來(lái)說(shuō),OffsetDateTime和ZonedDateTime的區(qū)別主要在于ZoneOffset和ZoneId的區(qū)別。如果你只是用來(lái)傳遞數(shù)據(jù),請(qǐng)使用OffsetDateTime,若你想在特定時(shí)區(qū)里做時(shí)間顯示那么請(qǐng)務(wù)必使用ZonedDateTime。
總結(jié)
本著拒絕淺嘗輒止的態(tài)度,深度剖析了很多同學(xué)可能不太熟悉的OffsetDateTime、ZonedDateTime兩個(gè)API。總而言之,想要真正掌握日期時(shí)間體系(不限于Java語(yǔ)言,而是所有語(yǔ)言,甚至日常生活),對(duì)時(shí)區(qū)、偏移量的了解是繞不過(guò)去的砍,這塊知識(shí)有所欠缺的朋友可往前翻翻補(bǔ)補(bǔ)課。
最后在使用它們?nèi)倪^(guò)程中,有兩個(gè)提醒給你:
所有日期/時(shí)間都是不可變的類型,所以若需要比較的話,請(qǐng)不要使用==,而是用equals()方法。2、任何時(shí)候,構(gòu)造一個(gè)日期時(shí)間(包括它們?nèi)?請(qǐng)永遠(yuǎn)務(wù)必顯示的指定時(shí)區(qū),哪怕是默認(rèn)時(shí)區(qū)。這么做的目的就是明確代碼的意圖,消除語(yǔ)義上的不確定性。比如若沒(méi)指定時(shí)區(qū),那到底是寫(xiě)代碼的人欠考慮了呢,還是就是想用默認(rèn)時(shí)區(qū)呢?總之顯示指定絕大部分情況下比隱式“指定”語(yǔ)義上好得多。
本文思考題
看完了不一定懂,看懂了不一定會(huì)。來(lái),文末3個(gè)思考題幫你復(fù)盤:
如何用LocalDateTime描述美國(guó)紐約本地時(shí)間?
OffsetDateTime和ZonedDateTime你到底該使用誰(shuí)?
一個(gè)人的生日應(yīng)該用什么Java類型存儲(chǔ)呢?