2 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個贊
時(shí)間戳(帶時(shí)區(qū))
據(jù)我所知,數(shù)據(jù)庫中的日期時(shí)間以UTC為單位,但是當(dāng)您檢索它時(shí),您(錯誤地)收到2017-02-09T16:38:58.000 + 02:00。
首先,如果可以的話,將MySQL數(shù)據(jù)庫列的數(shù)據(jù)類型更改為(在其他一些數(shù)據(jù)庫中,它將被稱為 )。這將確保MySQL知道時(shí)間是UTC,并且應(yīng)該使您能夠?qū)⑺鼈儥z索為正確的時(shí)間點(diǎn),而不是在錯誤的時(shí)區(qū)中檢索正確的時(shí)間。這反過來又將為您提供轉(zhuǎn)換為客戶端時(shí)區(qū)的最佳起點(diǎn)。timestamptimestamp with time zone
java.time
其次,從 java.time(現(xiàn)代 Java 日期和時(shí)間 API)中檢索您的值到適當(dāng)?shù)念愋椭?。避免,因?yàn)樗O(shè)計(jì)不佳,無法處理不同的時(shí)區(qū)。例如,如果數(shù)據(jù)庫數(shù)據(jù)類型為 :java.util.Datedatetime
LocalDateTime dateTime = yourResultSet.getObject("your_col", LocalDateTime.class);
LocalDateTime是一天中沒有時(shí)區(qū)的日期和時(shí)間,因此您不能獲得錯誤的時(shí)區(qū)。提供您知道正確的偏移量:
OffsetDateTime odt = dateTime.atOffset(ZoneOffset.UTC);
轉(zhuǎn)換為客戶端時(shí)區(qū):
ZoneId clientTimeZone = ZoneId.of("Indian/Reunion");
ZonedDateTime clientDateTime = odt.atZoneSameInstant(clientTimeZone);
System.out.println(clientDateTime);
2017-02-09T20:38:58+04:00[印度/留尼汪]
在區(qū)域/城市格式中使用實(shí)時(shí)時(shí)區(qū),而不是像 .它更容易理解,更面向未來。印度/留尼汪島只是一個例子,當(dāng)然,為您的客戶使用正確的一個。+04:00
上面有偏移量和時(shí)區(qū)。建議保持這種方式,我不認(rèn)為它有任何危害??蛻舳耸冀K可以選擇不顯示它。如果您仍然堅(jiān)持,請?jiān)俅无D(zhuǎn)換為:ZonedDateTimeLocalDateTime
LocalDateTime clientDateTimeWithoutOffset = clientDateTime.toLocalDateTime();
System.out.println(clientDateTimeWithoutOffset);
2017-02-09T10:38:58
如果數(shù)據(jù)庫數(shù)據(jù)類型為時(shí)間戳:
OffsetDateTime odt = yourResultSet.getObject("your_col", OffsetDateTime.class);
這樣就節(jié)省了上面的第一步。其余的是相同的。

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個贊
java.util.Date 不存儲任何時(shí)區(qū)。它只是存儲自“epoch”(即 1970 年 1 月 1 日 00:00:00 UTC)以來的毫秒數(shù)。
因此,您所要做的就是知道服務(wù)器計(jì)算機(jī)的時(shí)區(qū),找到此時(shí)區(qū)與要將其轉(zhuǎn)換為的時(shí)區(qū)之間的時(shí)間段,然后添加或減去該時(shí)間段。
更新:
int clientGMT = 4; //GMT you want to convert to
int serverGMT = 2; //server's GMT
int delta = clientGMT - serverGMT; //delta between the dates
//assume this is the date in GMT + 2 received from the server
Date d1 = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss").parse("12.03.2019 13:00:00");
//... and you want to convert it to GMT + 4 (client side's time zone)
Date resultDate = new Date(d1.getTime() + delta * 3600000);
附言是的,您必須手動操作時(shí)區(qū),正如我上面所說,不會存儲此信息(每個日期都假定為UTC)。java.util.Date
添加回答
舉報(bào)