2016-07-25 28 views
-2

我有一個字符串「2016-07-21T21:30:47.492 + 0000」我想將它保存在具有'TIMESTAMP WITH TIMEZONE'數據類型的列中的數據庫中。請提出解決方案。在java中將字符串轉換爲'帶時區的時間戳'

這是我做過什麼:

final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSX"); 
final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
final Date d1 = mdyFormat.parse(strDate); 
final String mdx = sdf.format(d1); 
+1

您正在使用哪種數據庫軟件? –

+2

你到目前爲止嘗試過什麼?這聽起來像你應該基本上解析字符串,可能是java.util.Date或java.time.Instant,然後轉換爲java.sql.Timestamp並在PreparedStatement中使用。 –

+0

Toad for Oracle –

回答

0

您的代碼有一個問題

String strDate = "2016-07-21T21:30:47.492+0000"; 
     final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSX"); 
    // include `T` as well 

    final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
    final Date d1; 
      try { 
       d1 = mdyFormat.parse(strDate); 
// to add time zone you can use below line 
// sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
       String mdx = sdf.format(d1); 
       System.out.println(mdx); 
      } catch (ParseException ex) { 

      } 

輸出而不sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

22-07-2016

輸出與sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

21-07-2016

TimeZone.getDefault()獲取系統的默認時區。

+0

謝謝AJ。這改正了日期。但我仍然得到2016-07-21T21:30:47.492Z的輸出。而且,當把它保存在數據庫中時,我得到'不是有效月份'的錯誤。 P.S - 在數據庫方面,類型是TIMESTAMP WITH TIMEZONE –

1

您正在使用現在由java.time類代替的麻煩舊類。

以下是如何按照Jon Skeet在對該問題的評論中發表的建議。

java.time

java.time框架是建立在Java 8和更高版本。這些課程取代了老的麻煩日期時間課程,如java.util.Date,.Calendar,& java.text.SimpleDateFormatJoda-Time團隊還建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。

許多java.time功能被移植到Java中,並在ThreeTen-Backport中被移植到Java中,並進一步適用於Android中的ThreeTenABP

OffsetDateTime

您可以分析輸入字符串作爲OffsetDateTime對象。

OffsetDateTime odt = OffsetDateTime.parse("2016-07-21T21:30:47.492+0000"); 

如果你的JDBC驅動程序與JDBC 4.2或更高版本的規定,您可以通過/取通過PreparedStatement::setObjectResultSet::getObject方法爲SQL。如果不是,則轉換爲舊的java.sql類型。

轉換需要一個Instant對象。 Instant是java.time中更基本的構造塊類,缺少OffsetDateTime的靈活性。 Instant類表示UTC中時間軸上的一個時刻,分辨率高達納秒。從OffsetDateTime中提取Instant

Instant instant = odt.toInstant(); 

Instant傳遞給添加到舊的java.sql類的新方法。

java.sql.Timestamp ts = java.sql.Timestamp.from(instant); 

然後調用PreparedStatement::setTimestampResultSet::getTimestamp方法。

myPreparedStatement.setTimestamp(1 , ts); 
… 
java.sql.Timestamp ts = myResultSet.getTimestamp(1); 

取出一個java.sql.Timestamp後,立即轉換爲java.time類,Instant。只有在JDBC驅動程序缺少對java.time類型的直接支持的情況下才使用java.sql類,即使如此,也最大限度地減少了對java.sql類的使用。你的業務邏輯在java.time中工作嗎?

Instant instant = ts.toInstant(); 

混亂的類名

不要混淆與Java捆綁在一起的兩個老Date類。 java.util.Date代表日期。 A java.sql.Date旨在僅表示沒有日期時間的日期值(但由於它是笨拙的類設計的笨拙攻擊,實際上確實存在時間問題)。

完全避免java.util.Datejava.util.Calendarjava.text.SimpleDateFormat類。如上所述,儘量減少您對類的使用。

+0

你的回答救了我! –

+0

@GauravKhare好,我很高興。日期時間處理是棘手的工作。您可以通過學習Stack Overflow的更多問答來了解更多信息。請特別注意[Jon Skeet](https://stackoverflow.com/users/22656/jon-skeet)的答案,以及提及java.time的答案。 –

+0

謝謝你提出這些帖子,並且你是正確的日期時間處理對我來說真的非常棘手。 –

相關問題