1 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用時(shí)區(qū)而不僅僅是偏移量。
ZonedDateTime.now(
ZoneId.of( "Europe/Dublin" )
)
細(xì)節(jié)
在現(xiàn)代協(xié)議中,偏移量中的小時(shí)-分鐘-秒數(shù)被認(rèn)為是領(lǐng)先于基線 (GMT/UTC) 的正數(shù),而落后于基線的負(fù)數(shù)。一些較舊的協(xié)議是相反的。您的Etc/GMT+1風(fēng)格似乎相反。
最好的解決方案是使用時(shí)區(qū)而不是僅僅使用偏移量。偏移量只是小時(shí)數(shù)-分鐘-秒數(shù)。時(shí)區(qū)要多得多。時(shí)區(qū)是特定地區(qū)的人們使用的偏移量的過(guò)去、現(xiàn)在和未來(lái)變化的歷史。
時(shí)區(qū)的名稱格式為Continent/Region. 例如,America/Montreal、Europe/Paris和Pacific/Auckland。
ZoneId z = ZoneId.of( "Europe/Dublin" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
生成標(biāo)準(zhǔn) ISO 8601 格式的字符串,明智地?cái)U(kuò)展以在方括號(hào)中附加區(qū)域名稱。
String output = zdt.toString() ;
您的大部分業(yè)務(wù)邏輯、日志記錄和數(shù)據(jù)更改都應(yīng)該采用 UTC。要調(diào)整為 UTC,請(qǐng)Instant從您的ZonedDateTime. 同一時(shí)刻,時(shí)間軸上的同一點(diǎn),但掛鐘時(shí)間不同。
Instant instant = zdt.toInstant() ;
生成標(biāo)準(zhǔn) ISO 8601 格式的字符串。
String output = instant.toString() ;
你的榜樣
所以現(xiàn)在我們可以回去檢查你的具體情況。
[Etc/GMT+1]讓我們用區(qū)域名稱解析給定的字符串。
String input = "2019-07-02T14:23:57.463-01:00[Etc/GMT+1]" ;
ZonedDateTime zdtInput = ZonedDateTime.parse ( input );
然后調(diào)整為UTC。
Instant instant = zdtInput.toInstant ();
再次調(diào)整成Europe/Dublin。
ZoneId zDublin = ZoneId.of( "Europe/Dublin");
ZonedDateTime zdtDublin = zdtInput.withZoneSameInstant ( zDublin );
轉(zhuǎn)儲(chǔ)到控制臺(tái)。
System.out.println ("zdtInput: " + zdtInput );
System.out.println ("instant: " + instant );
System.out.println ("zdtDublin: " + zdtDublin );
在 IdeOne.com 上查看此代碼的實(shí)時(shí)運(yùn)行。
zdt 輸入:2019-07-02T14:23:57.463-01:00[等/GMT+1]
即時(shí):2019-07-02T15:23:57.463Z
zdtDublin: 2019-07-02T16:23:57.463+01:00[歐洲/都柏林]
第 14 小時(shí)
果然,我們看到時(shí)間比UTC晚[Etc/GMT+1]一個(gè)小時(shí)(小時(shí)偏移的舊反向含義)一個(gè)小時(shí)。14
第 15 小時(shí)
UTC(零小時(shí)-分鐘-秒的偏移量)有一個(gè)小時(shí)15。
第 16 小時(shí)
都柏林時(shí)區(qū)當(dāng)時(shí)使用愛爾蘭標(biāo)準(zhǔn)時(shí)間 (IST)、UTC +1 而不是夏令時(shí) (DST)。所以我們看到它的時(shí)間是,比 UTC 的時(shí)間早16一個(gè)小時(shí)。15
關(guān)鍵:理解所有這三個(gè)代表同一時(shí)刻,時(shí)間軸上非常相同的一個(gè)點(diǎn)。他們的掛鐘時(shí)間不同:查看同一時(shí)刻的三種方式。
順便說(shuō)一句,當(dāng)您想要專門使用偏移量而不是時(shí)區(qū)時(shí),請(qǐng)使用OffsetDateTime&ZoneOffset類。ZonedDateTime&類ZoneId用于時(shí)區(qū)。
添加回答
舉報(bào)