2014-01-25 58 views
0

我想使用Java中的SimpleDateFormat類將日期從一個時區轉換爲其他時區。 但不知怎的,它產生了不同的結果,假設它們在相同的TimeZone中。將日期從一個時區轉換爲java中的其他時區

這裏是一個測試用例,它產生一個結果爲IST,另一個結果爲GMT。我認爲它應該只產生兩種情況下的GMT。

public class TestOneCoreJava { 

    public static void main(String[] args) throws ParseException {// Asia/Calcutta 
     DateFormat formatter = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a"); 
     System.out.println(getDateStringToShow(formatter.parse("26-Nov-10 03:31:20 PM +0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
     System.out.println(getDateStringToShow(formatter.parse("02-Oct-10 10:00:00 AM +0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
     //------Output-- 
     //26-Nov-10 GMT 
     //02-Oct-10 IST 
    } 

    public static String getDateStringToShow(Date date, 
      String sourceTimeZoneId, String targetTimeZoneId, boolean includeTime) { 
     String result = null; 

     // System.out.println("CHANGING TIMEZONE:1 "+UnitedLexConstants.SIMPLE_FORMAT.format(date)); 
     String date1 = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a").format(date); 

     SimpleDateFormat sourceTimeZoneFormat = new SimpleDateFormat("Z"); 
     sourceTimeZoneFormat.setTimeZone(TimeZone.getTimeZone(sourceTimeZoneId)); 

     date1 += " " + sourceTimeZoneFormat.format(date); 

     // Changed from 'Z' to 'z' to show IST etc, in place of +5:30 etc. 
     SimpleDateFormat targetTimeZoneFormat = new SimpleDateFormat("dd-MMM-yy hh:mm:ss a z"); 
     targetTimeZoneFormat.setTimeZone(TimeZone.getTimeZone(targetTimeZoneId)); 

     SimpleDateFormat timeZoneDayFormat = null; 
     if (includeTime) { 
      timeZoneDayFormat = targetTimeZoneFormat; 
     } else { 
      timeZoneDayFormat = new SimpleDateFormat("dd-MMM-yy z"); 
     } 
     timeZoneDayFormat.setTimeZone(TimeZone.getTimeZone(targetTimeZoneId)); 
     try { 
      result = timeZoneDayFormat.format(targetTimeZoneFormat.parse(date1)); 
      // System.out.println("CHANGING TIMEZONE:3 "+result); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
} 

回答

0

避免3個字母的時區代碼

避免這些三字母時區代碼。它們既不標準也不唯一。例如,您使用「IST」可能意味着印度標準時間,愛爾蘭標準時間以及其他標準時間。

正確使用time zone names。時區及其名稱的定義會經常更改,因此請將源保持最新。例如,舊的「亞洲/加爾各答」現在是「亞洲/加爾各答」。而不僅僅是名字;政府在最後時刻偶爾會改變時區的規則/行爲而臭名昭着。

避免j.u.Date

避免使用捆綁java.util.Date和Calendar類。它們出了名的麻煩,並將在Java 8中被新的java.time.* package(它的靈感來源於Joda-Time)所取代。

喬達時間

目前,使用Joda-Time 2.3。

請注意java.util.Date對象,它們看起來像是有時區但實際上沒有。在Joda-Time,DateTime確實知道其指定的時區。一般應該指定一個期望的時區。否則,JVM的默認時區將被分配。

Joda-Time主要使用不可變對象。不是修改實例,而是創建一個新的實例。當調用toDateTime等方法時,會返回一個新的DateTime實例,使原始對象保持不變並保持不變。

//DateTime now = new DateTime(); // Default time zone automatically assigned. 

// Convert a java.util.Date to Joda-Time. 
java.util.Date date = new java.util.Date(); 
DateTime now = new DateTime(date); // Default time zone automatically assigned. 

DateTimeZone timeZone = DateTimeZone.forID("Asia/Kolkata"); 
DateTime nowIndia = now.toDateTime(timeZone); 

// For UTC/GMT, use built-in constant. 
DateTime nowUtcGmt = nowIndia.toDateTime(DateTimeZone.UTC); 

// Convert from Joda-Time to java.util.Date. 
java.util.Date date2 = nowIndia.toDate(); 

轉儲到控制檯...

System.out.println("date: " + date); 
System.out.println("now: " + now); 
System.out.println("nowIndia: " + nowIndia); 
System.out.println("nowUtcGmt: " + nowUtcGmt); 
System.out.println("date2: " + date2); 

運行時...

date: Sat Jan 25 16:52:28 PST 2014 
now: 2014-01-25T16:52:28.003-08:00 
nowIndia: 2014-01-26T06:22:28.003+05:30 
nowUtcGmt: 2014-01-26T00:52:28.003Z 
date2: Sat Jan 25 16:52:28 PST 2014 
0

在處理Google API中的時區問題時。我遇到過這樣的問題。

看看這塊的你的代碼: -

System.out.println(getDateStringToShow(formatter.parse("26-Nov-10 03:31:20 PM 
+0530"),"Asia/Calcutta", "Europe/Dublin", false)); 
System.out.println(getDateStringToShow(formatter.parse("02-Nov-10 10:00:00 AM 
+0530"),"Asia/Calcutta", "Europe/Dublin", false)); 

如果我給上面的輸入將運行良好,我們想要的方式。


如果你還想去用這種方式,那麼你必須根據你的需要來進行計算。

像調整時間數學和類似的東西。對於你的情況


還是一個簡單的解決會是這樣的

SimpleDateFormat d =new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
d.setTimeZone(TimeZone.getTimeZone("Europe/Dublin")); 
Date firsttime = d.parse("2013-12-19T03:31:20"); 
Date seondtime = d.parse("2013-12-19T10:00:00"); 

System.out.println(getDateStringToShow(firsttime,"Asia/Calcutta", 
"Europe/Dublin", false)); 
System.out.println(getDateStringToShow(seondtime,"Asia/Calcutta", 
"Europe/Dublin", false)); 

我的建議將是參考JODA API。更優於老學校的日期。

相關問題