2016-06-17 13 views
6

我在oracle表中有一個時間戳列。在存儲時間時,我將它以UTC格式存儲在此列中。爲了檢索這個時間戳,我使用了Spring的JdbcTemplate,同時返回TimeStamp類型的對象。如何檢索Java中預期時區中的Oracle Timestamp列?

我想在當前時區以「dd-MM-YYYY HH:mm:ss」格式獲取日期時間字符串。爲了實現這一點,我正在嘗試以下代碼:

new LocalDateTime(<retrieved TimeStamp>, <current user DateTimeZone>).toString("yyyy-MM-dd HH:mm:ss") 

Joda庫中的LocalDateTime和DateTimeZone。

這是如何不按預期工作。而不是當前用戶的時區上面的代碼給我日期時間字符串只在UTC。

我錯過了什麼?

+0

什麼是對你在這裏實例化LocalDateTime完全合格的類名?我無法找到任何類似你正在做的事情的文檔。 –

+0

我的不好。在說明中更新。它來自喬達圖書館。 –

回答

2

獲取從數據庫中的時間戳時添加UTC日曆,所以JDBC驅動程序可以使用這個日曆時區,而不是默認的系統時區。

//Assign utc calendar 
Calendar utc= Calendar.getInstance(); 
utc.setTimeZone(TimeZone.getTimeZone("UTC")); 
Timestamp timestamp = rs.getTimestamp("timestampcolumn", utc); 
//Convert to client date time 
DateTime dateTime = new DateTime(timestamp.getTime(), DateTimeZone.forID("Asia/Kolkata")); 
//Format 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
//Change to client wall clock time 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime) 

String utcTime = "2016-06-17 14:22:02Z"; 
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ"); 
DateTime dateTime = parser.parseDateTime(utcTime).withZone(DateTimeZone.forID("Asia/Kolkata")); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
System.out.println(dateTime); 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime); 
System.out.println(formattedlocalDateTime); 
+0

這種方法是否在正確的時區給你日期時間?我試過這個,我仍然有這個問題。 –

+0

用示例更新了答案。您可以輸入您的值,看看它是否適用於您, – Veeram

+0

對於相同的代碼,我在我的機器上獲得以下值:timestamp:2016-06-17 09:33:25.0,datetime:2016-06-17T09:33: 25.000 + 05:30,localDateTime:2016-06-17T09:33:25.000,formatter.print(localDateTime):17-06-2016 09:33:25。我曾使用「亞洲/加爾各答」作爲時區。 –

4

我認爲您的應用程序使用的是java.util.Date,它沒有時區信息,toString用法在創建字符串時應用JVM的當前默認時區。

您可以調整(Using Joda Library

ZonedDateTime Tokyo = ZonedDateTime.ofInstant (instant,zoneIdTokyo) ; 

的時區即時或實施區域

DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); 

您正在使用 LocalDateTime這是代表本地日期和時間(沒有時間不可變類區)

編輯 - 你可以試試這個 (我沒有測試過)

DateTime udate = new DateTime("2016-05-01T20:10:04", DateTimeZone.UTC); 
System.out.println(udate); 
DateTime zone = udate.plusMillis(10000) 
.withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println(zone); 
+0

如果您可以提供實際將Timestamp對象轉換爲格式化字符串的小代碼片段,我將非常感激。 –

相關問題