簡體   English   中英

如何從MySQL DATETIME轉換為java.time.Instant並在系統默認時區顯示給用戶?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM