java中特定日期时间的时区转换

java中特定日期时间的时区转换,java,timezone,Java,Timezone,我会给一个时区的输入日期时间和输入日期时间的时区,我们希望相关的日期时间在预期的时区 这是我的方法。 convertToTimezone(“2010年8月3日20:19:00下午”,“亚洲/上海”,“美国/中部”); 以上时间是亚洲/上海的时间。我们想知道美国/中部的相应时间 工作正常,但我与实际时间相差1小时。 我能知道我哪里出了问题吗 这是代码 import java.text.DateFormat; import java.text.SimpleDateFormat; import jav

我会给一个时区的输入日期时间和输入日期时间的时区,我们希望相关的日期时间在预期的时区

这是我的方法。 convertToTimezone(“2010年8月3日20:19:00下午”,“亚洲/上海”,“美国/中部”); 以上时间是亚洲/上海的时间。我们想知道美国/中部的相应时间

工作正常,但我与实际时间相差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;
    }

    }

你不应该在日历上添加任何东西——它代表了一个特定的时间点。事实上,你根本不需要日历

相反,有两种不同的格式,每个时区一种:

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);
}
顺便说一句,我完全建议使用而不是内置的日期/时间API