![](/img/trans.png)
[英]Convert XMLGregorianCalendar to java.time.Instant + switch timezone in the meanwhile
[英]How do I convert from MySQL DATETIME to java.time.Instant and display to user in system default timezone?
我正在為一個學校的項目工作,我全神貫注。 這是背景:
我正在開發一個將在本地運行的JavaFX約會應用程序,因此我不必擔心服務器端時區與實際用戶時間不同的后果。 我不能使用任何第三方庫。 該應用程序當前使用DatePicker和兩個ComboBox控件供用戶輸入日期,小時和分鍾值。 它們使用傳統的get / set方法存儲在Instant變量(開始)中的約會對象上。 我已成功從控件寫入數據庫,並且結果如預期般出現。 如果我選擇06/31/2019和12:00,然后將其寫入數據庫,它將顯示在數據庫中,存儲在``開始''列(其數據類型為DATETIME)中為2019-12-31 17:00: 00 我在CST中,所以我的UTC時差是-5小時。 到目前為止,我相信一切都是桃子。
從這里,有東西往南走。 我在ResultSet中的每個項目上使用類似的東西將每個數據庫約會映射到一個ObservableList對象
Instant start = i_rs.getTimestamp("start").toInstant();
Return newAppointment(start);
即時啟動變量的值檢查給我:
2019-12-31T17:00
正如我所期望的。 但是,我似乎無法成功地將此時間轉換為用戶的時區。 我最接近的是這樣的:
ZonedDateTime localStartDate = currentAppointment
.getStart()
.atZone(ZoneId.systemDefault());
但這又回來了
2019-12-31T17:00-05:00
我也嘗試過
ZonedDateTime zdt = date.atZone(ZoneOffset.systemDefault());
但這最終使我的時間朝錯誤的方向發展,
2019-12-31T22:00
我已經在這個小“容易”的部分上工作了整整一天。 任何幫助將不勝感激。
ZonedDateTime localStartDate = currentAppointment
.getStart()
.atZone(ZoneId.systemDefault());
在這里,您說“我有一些時間戳,將其視為CST”,這就是為什么它變為“ 17:00-05:00”
似乎您將時間戳存儲在UTC中(如果您不這樣做,那么我建議您將編寫代碼更改為始終存儲在UTC中),因此您應該將其告知Java
ZonedDateTime localStartDate = currentAppointment
.getStart()
.atZone(ZoneId.of("UTC")) // my instant is UTC
.withZoneSameInstant(ZoneId.systemDefault()) // convert to my local zone
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.