2012-03-30 5 views
0

Я дам время ввода даты для часового пояса и часовой пояс для даты ввода данных, и мы хотим, чтобы соответствующее время в ожидаемом часовом поясе.Изменение часового пояса для определенного времени и времени в java

И вот мой метод. convertToTimezone («03/08/2010 20:19:00 PM», «Азия/Шанхай», «США/Центральная»); Вышеупомянутое время - это время в Азии/Шанхае. Мы хотели бы узнать, какое именно время в US/Central.

Он работает нормально, но я получаю разницу в 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.