我有字符串格式dd-MM-yyyy HH:mm:ss格式的json輸入中的本地日期[讓它是任何格式都沒有問題],在標題中有一個單獨的字段時區[例如:CST、CDT等]。在java中,當我嘗試用這個值和時區創建一個日期時,它是用我的系統[jvm running system]時區創建的。我需要使用輸入時區從輸入中保留確切的日期和時間。我該怎么做 ?我什至嘗試將日期對象@DateTimeFormat放在 dto 而不是字符串中,但這不起作用。我想要一個這樣的方法來從輸入日期字符串和時區獲取本地日期。public Date getLocalDate(String dateString, String localTimeZone) { SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss a"); formatter.setTimeZone(TimeZone.getTimeZone(localTimeZone)); return formatter.parse(dateString);}輸入:dateString:“20-04-2019 20:15:00 AM”localTimeZone:“CDT”。預期輸出:日期對象,值為 20-04-2019 20:15:00 AM CDT。實際輸出:與 IST-CDT 時差與 IST 時區相同的日期
2 回答

蕭十郎
TA貢獻1815條經驗 獲得超13個贊
關于Date
對象的真正含義存在誤解。自'01-01-1970 00:00:00 UTC'
. 換句話說,它始終是 UTC 日期/時間,當您嘗試打印它時,默認格式化程序會在您的本地時區中隱式轉換它。
如果您想同時存儲瞬間(即 UTC 日期/時間)和時區,則必須使用Calendar
對象。但無論如何,如果你想在 Oracle 中存儲時間和區域,你應該直接存儲一個字符串,或者一個日期和一個字符串(對于時區),因為 AFAIK,Oracle DATE 字段沒有時區的概念。

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
java.time
您正在使用幾年前被JSR 310 中定義的java.time類取代的糟糕的日期時間類。
“CST”和這樣的 2-4 個字符的偽區域不是時區。它們不是標準化的,甚至不是唯一的!例如:CST
是北美中部時間,也是中國標準時間。
真正的時區采用格式Continent/Region
。例如:Europe/Paris
或Africa/Tunis
。請參閱維基百科中的列表。
要在時區的上下文中表示日期和時間,請使用ZonedDateTime
class。
LocalDateTime
要存儲與區域、使用和ZoneId
類分開的日期時間。
數據庫
您的評論表明希望將當前時刻存儲在數據庫中。
以 UTC 捕獲當前時刻。
Instant instant = Instant.now() ;
要與 JDBC 4.2 一起使用,請轉換為OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
傳遞給準備好的語句。
myPreparedStatement.setObject( … , odt ) ;
取回。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
添加回答
舉報
0/150
提交
取消