2012-06-25 48 views
2

我需要操作java.sql.Timestamp。在另一個時區將java.sql.Timestamp轉換爲java.sql.Timestamp

輸入到該函數是: 格式化過的時間中的java.sql.Timestamp [可能的日期格式:MM/DD/YYYY HH:MM:SS AA,MM/DD/YYYY HH:MM:SS,MM/dd/yyyy hh:mm aa,MM/dd/yyyy HH:mm,MM/dd/yy hh:mm aa,MM/dd/yh HH:mm,MM/dd/yyyy等]

所需的輸出: java.sql.Timestamp中的另一個時區相同的格式化過的時間作爲輸入

所以基本上我需要更改日期時間的時區中的java.sql.Timestamp

I H大家見過其他職位,其中提到使用JODA,但由於一些限制,我無法使用它。

我曾嘗試 - 以java.sql.Timestamp中轉換爲java.date.Calendar, - 然後將其轉換到它的最新 - - 然後是時區, 更改日期格式相同的格式化過的時間

請參見下面的代碼:

Timestamp ts = "2012-06-20 18:22:42.0"; // I get this type of value from another function 
Calendar cal = Calendar.getInstance(); 
cal.setTime(ts); 
cal.add(Calendar.HOUR, -8); 
String string = cal.getTime().toString();  // return value is in " DAY MMM dd hh:mm:ss PDT yyyy " format i.e. Wed Jun 20 10:22:42 PDT 2012 
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss"); // This could be any format required 
Date date; 
try { 
    date = formatter.parse(string);    // I am getting exception here on parsing 
} catch (ParseException e1) { 
    e1.printStackTrace(); 
} 

誰能告訴我這裏有什麼問題,或者是有任何其他方式來對時區進行操縱的java.sql.Timestamp?

謝謝。

+0

什麼是例外? – Tiago

+0

我得到java.text.ParseException:Unparseable date:「Wed Jun 20 10:22:42 PDT 2012」 – sankethm7

+1

所以你有它,格式是完全錯誤的沒有? – Tiago

回答

0

一個argumment你不能簡單地說:

  1. 獲取原始時間以毫秒爲單位
  2. 轉換時區的差異,以毫秒爲單位
  3. 添加或減去與原始時間不同。
  4. 以毫秒爲單位創建一個使用新的時新的時間戳
+0

我已經在Timestamp類型中設置了格式化時間,實際上它是UTC時間。我需要轉換爲不同的時區,並以相同的格式和時間戳類型返回。所以我不認爲以毫秒計算是在不同時區轉換時間的好方法。我保持它作爲我的最後選擇。 – sankethm7

0

想想時間戳的作爲一個固定的時間點,從在地球上,你碰巧要尋找一個時鐘中斷。

如果你想顯示在特定時間區那一瞬間的日曆/時鐘的人,你可以設置日曆到時區,然後你的SimpleDateFormat到日曆關聯。

例如:

public void testFormat() throws Exception { 
    Calendar pacific = Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")); 
    Calendar atlantic = Calendar.getInstance(TimeZone.getTimeZone("America/New_York")); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    Timestamp ts = new Timestamp(System.currentTimeMillis()); 
    sdf.setCalendar(pacific); 
    System.out.println(sdf.format(ts)); 
    sdf.setCalendar(atlantic); 
    System.out.println(sdf.format(ts)); 
} 

我的產量爲:

2012-06-25 20:27:12.506 
2012-06-25 23:27:12.506 
+0

嘿@Phatfingers,我試過你的解決方案,似乎我在正確的軌道上,但事情是我已經格式化時間戳顯示UTC的時間。我需要轉換到不同的時區。在你的代碼示例中,在行sdf.setCalendar(pacific);它不會將時間轉換爲PST,因爲我的開發時區是「pastif」。我需要的是將檢索到的'ts'設置爲UTC,然後將其轉換爲不同的時區;但我無法實現它。有什麼方法可以提到'ts'中的值是UTC。然後轉換爲所需的時區? – sankethm7

+0

關鍵是要將您的時間戳記作爲唯一代表UTC的時間戳,並將日期和時間的顯示作爲包含時區的演示函數進行處理。忽略Timestamp具有使用系統時區的toString()方法的事實。在引擎蓋下,它始終使用UTC來跟蹤時間,並且沒有內置時區的真正概念。您不會將時間戳「轉換」爲一個時區或另一個時區,而是使用一個時區格式化時間戳的輸出或其他。 – phatfingers

+0

@ sankethm7如果您的系統的時區爲PST,並且您的時間戳的原生toString()輸出看起來是一個有效的UTC時間,那麼您可能會無意中將時間戳的值調整爲與正確時間相差8小時。你不會想要的。 – phatfingers

0

我把它解決了,我把代碼以供參考。

Timestamp ts = "2012-06-20 18:22:42.0"; // input date in Timestamp format 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(ts) 
cal.add(Calendar.HOUR,-7); // Time different between UTC and PDT is -7 hours 
String convertedCal = dateFormat.format(cal.getTime()); // This String is converted datetime 
/* Now convert String formatted DateTime to Timestamp*/ 
SimpleDateFormat formatFrom = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
try {  
    Date date = formatFrom.parse(convertedCal); 
    Timestamp finalTS = new Timestamp(date.getTime()); // Final value in Timestamp: 2012-06-20 11:22:42.0 
} catch (Exception e) { 
    e.printStackTrace();    
} 
相關問題