2012-03-30 92 views
0

我將給出時區的輸入日期時間和輸入日期時間的時區,我們希望相關日期時間處於預期時區。java中特定日期時間的時區轉換

這是我的方法。 convertToTimezone(「03/08/2010 20:19:00 PM」,「亞洲/上海」,「美國/中環」); 以上時間是亞洲/上海的時間。我們想知道美國/中國的相應時間。

它工作正常,但我得到的實際時間差1小時。 我可以知道我要去哪裏嗎?

這是代碼。

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.TimeZone; 

public class DateUtil 
{ 

    private static String format_date="MM/dd/yyyy HH:mm:ss a"; 

    public static void main(String a[]) 
    { 
     try 
     { 
      String sourceTimezone="Asia/Shanghai"; 
      String destTimezone="US/Central";   
      String outputExpectedTimezone=convertToTimezone("03/08/2010 20:19:00 PM",sourceTimezone,destTimezone); 
      System.out.println("outputExpectedTimezone :"+outputExpectedTimezone); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    public static String convertToTimezone(String inputDate,String inputDateTimezone,String destinationDateTimezone)throws Exception 
    { 
     String outputDate=null; 

     SimpleDateFormat format = new SimpleDateFormat(format_date); 
     format.setTimeZone(TimeZone.getTimeZone(inputDateTimezone)); 

     Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(inputDateTimezone)); 
     calendar.setTime(format.parse(inputDate)); 
     calendar.add(Calendar.MILLISECOND,-(calendar.getTimeZone().getRawOffset()));   
     calendar.add(Calendar.MILLISECOND, - calendar.getTimeZone().getDSTSavings()); 
     calendar.add(Calendar.MILLISECOND, TimeZone.getTimeZone(destinationDateTimezone).getRawOffset()); 

     outputDate=format.format(calendar.getTime()); 
     return outputDate; 
    } 

    } 

回答

2

你不應該添加任何日曆 - 表示在某一特定時刻。事實上,你根本不需要日曆。

相反,有兩個不同的格式,每一個時區:

public static String convertToTimezone(String inputDate, 
    String inputDateTimezone, 
    String destinationDateTimezone) 
    throws Exception 
{ 
    SimpleDateFormat parser = new SimpleDateFormat(format_date); 
    parser.setTimeZone(TimeZone.getTimeZone(inputDateTimezone)); 

    Date date = parser.parse(inputDate); 

    SimpleDateFormat formatter = new SimpleDateFormat(format_date); 
    formatter.setTimeZone(TimeZone.getTimeZone(outputDateTimezone)); 
    return formatter.format(date); 
} 

順便說一句,我會用Joda Time代替徹底推薦內置的日期/時間API。

相關問題