亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

jOOQ 將偏移日期時間返回為 Z (UTC),即使它不是

jOOQ 將偏移日期時間返回為 Z (UTC),即使它不是

胡說叔叔 2023-07-13 15:33:47
我有一個簡單的 Postgres 測試表,其中包含 id、時間戳和時區。下面的測試和輸出應該是不言自明的,但總而言之,我插入了一行,其時間戳的偏移量為 -6。它被正確地插入到數據庫中,然后以相同的時間從數據庫中加載出來,但是偏移量錯誤,特別是Z而不是-6。我嘗試將數據庫設置為 UTC,當我在命令行中手動選擇時,它會正確顯示 UTC 時間。將數據庫設置為 mountain,它顯示預期時間,偏移量為-6。通過在 jOOQ 中執行的語句強制數據庫到不同的時區似乎沒有任何作用。context.execute( "set timezone TO 'GMT';" ); // this has no effect強制我的系統時間為 UTC 可以有效解決該問題,但由于多種原因是不可接受的。TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) ); // this is a band aid that works, but is not sustainable這是單元測試:@Testpublic void confirmDateRoundTripFromDb() throws SQLException, DatatypeConfigurationException{    ZonedDateTime testDate = ZonedDateTime.of( 2019, 05, 30, 12, 54, 32, 203, TimeUtilities.CENTRAL_ZONEID );    final OffsetDateTime testDateAsOffset = testDate.toOffsetDateTime( );    try( PGConnection dbConnection = DatabaseUtility.getPostgresConnection( _unitTestConfig.getSection("Postgres").getProperties(), _testDbName ) )    {        DSLContext context = DSL.using( dbConnection, SQLDialect.POSTGRES );        DateTestsRecord dateTestsRecord = context.newRecord( DATE_TESTS );        dateTestsRecord.setTestTimestamp( testDateAsOffset );        dateTestsRecord.store();        int id = dateTestsRecord.getId();        DateTestsRecord insertedRecord = context.selectFrom( DATE_TESTS ).where( DATE_TESTS.ID.eq( id ) ).fetchAny();        System.out.println( testDateAsOffset );        System.out.println( insertedRecord.getTestTimestamp() );    }}和輸出:2019-05-30T12:54:32.000000203-05:002019-05-30T11:54:32Z有趣的是,如果我在中部添加日期,小時會正確更改為山區,但往返后的輸出仍然只是愉快地報告 Z。我認為這不是預期的?難道我做錯了什么?如果沒有,有什么可以在全球范圍內應用的解決方法的想法嗎?有幾個開發人員對此感興趣,我對每次選擇時都必須使用一些特殊邏輯處理日期感到不興奮,這似乎很脆弱。我一直在運行 3.10,但剛剛升級到 3.12,結果相同。
查看完整描述

2 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

這不是 jOOQ 問題。PostgreSQL 沒有與ZonedDateTime.?它的TIMESTAMPTZorTIMESTAMP WITH TIME ZONE類型實際上只是一個java.time.Instant.?

對于帶時區的時間戳,內部存儲的值始終采用 UTC(通用協調時間,傳統上稱為格林威治標準時間,GMT)。指定了顯式時區的輸入值將使用該時區的適當偏移量轉換為 UTC。如果輸入字符串中未指定時區,則假定其處于系統 TimeZone 參數指示的時區,并使用時區的偏移量將其轉換為 UTC。

jOOQ 無法為您做任何事。

請注意,jOOQ 默認將TIMESTAMP WITH TIME ZONE所有 SQL 數據庫中的類型映射到java.time.OffsetDateTime,因為這就是 JDBC 規范的作用。對于像 JDBC(和 jOOQ)這樣的供應商無關的 API,這是一個合理的默認值。但如果您想擁有 PostgreSQL 原生行為,我建議您將所有TIMESTAMPTZ類型重寫為INSTANT(如果您使用的是 jOOQ 3.12+)。

如果由于某種原因,您需要維護此信息,則需要將其存儲在單獨的列中,或text作為格式化值存儲在列中。


查看完整回答
反對 回復 2023-07-13
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

impossibl pgjdbc 驅動程序版本 0.7.1 和 jOOQ 之間存在不兼容性,導致在從 postgres 數據庫中選擇帶時區的時間戳時不應用偏移量。

萬一其他人也在運行這個 jar 組合,如果 impossibl 驅動程序中的功能是必要的,建議更新到 pgjdbc 0.8.2,如果不需要,則放棄。


查看完整回答
反對 回復 2023-07-13
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號