Преобразование часового пояса для конкретной даты и времени в Java - PullRequest
0 голосов
/ 30 марта 2012

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

А вот и мой метод. convertToTimezone ("08.03.2010 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;
    }

    }

1 Ответ

2 голосов
/ 30 марта 2012

Вы не должны ничего добавлять в календарь - это представляет определенный момент времени. На самом деле вам вообще не нужен календарь.

Вместо этого есть два разных формата , по одному для каждого часового пояса:

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 даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...