2017-10-12 100 views
0

我爲我的程序使用IntelliJ(我使用的是Kotlin和Java語言),我試圖通過使用來自數據庫的查詢得到時間報告並將其發送給瀏覽器我使用郵差來查看結果)。當我調試我的代碼,並通過查詢的結果時區似乎確定'就像我想要的方式,它甚至顯示-7(我和UTC之間的時間差),但是當涉及到瀏覽器(郵差)它顯示UTC時間和+0000,例如(「date」:「2017-10-12T15:00:33.000 + 0000」而不是「date」:「2017-10-12T15:00:33.000 + 0007」)。 我試了很多選擇,並浪費大約6個小時來找到解決方案,但沒有任何工作。 謝謝你的幫助TimeZone沒有顯示

回答

0

的Postgres存儲在UTCTIMESTAMP WITH TIME ZONE,用它來進行調整成UTC後丟棄通過區。請注意,這是Postgres特定的行爲 - 數據庫的日期時間處理差別很大,SQL規範幾乎沒有涉及到該主題。

如Marlowe所述,如果您需要記住從數據輸入中捕獲的時區,則需要將該時區存儲在另一列中。以continent/region的格式捕獲proper time zone name,例如America/Montreal,Africa/CasablancaPacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

➠以下是筆記:在交互式工具(例如pgAdmin )中的Postgres會話在獲取UTC值後動態應用默認時區。雖然是善意的,但我認爲這是一個反特徵,因爲它掩蓋了存儲數據的真實性質。

使用現代java.time類獲取UTC值。

Instant instant = myResultSet.getObject(… , Instant.class) ; 

調整到您想要的時區。

ZoneId z = ZoneId.of("Asia/Kolkata") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

生成使用DateTimeFormatter類的Web瀏覽器的字符串。請注意那裏的自動定位功能。

所有這些在Stack Overflow上已經被覆蓋了很多次。搜索以瞭解更多信息。

+0

謝謝你的回答。但因爲我使用Kotlin,我無法使用您的解決方案,我之前嘗試過類似的方法,但沒有成功 –

+0

@TalShani,這應該不重要。 Kotlin完全具備Java互操作能力。事實上,如果您將Java代碼複製粘貼到IntelliJ中,它將提供將其轉換爲Kotlin。 – Moira

+0

@ 1blustone是的我知道,但仍然沒有任何理由的數據是正確的後,我修復時區,但第二它應該去瀏覽器它再次變化 –