Изменение часового пояса, не изменяя время в Java

Я получаю дату и время от веб-сервиса SOAP без timzone информации. Следовательно, Ось deserializer принимает UTC. Однако дата и время действительно находится в Сиднейское время. Я решил проблему substracting смещение часового пояса:

Calendar trade_date = trade.getTradeDateTime();
TimeZone est_tz = TimeZone.getTimeZone("Australia/Sydney");
long millis = trade_date.getTimeInMillis() - est_tz.getRawOffset();
trade_date.setTimeZone( est_tz );
trade_date.setTimeInMillis( millis );

Однако я не уверен, принимает ли это решение также переход на летнее время во внимание. Я думаю, что это должно, потому что все операции находятся на времени UTC. Какой-либо опыт с управлением временем в Java? Лучшие идеи о том, как решить эту проблему?

13
задан 20 May 2010 в 11:14
поделиться

3 ответа

Я решил переанализировать полученную строку datetime с правильной установкой часового пояса. Это также должно учитывать переход на летнее время:

public class DateTest {

    private static SimpleDateFormat soapdatetime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

    /**
     * @param args
     */
    public static void main(String[] args) {
        TimeZone oztz = TimeZone.getTimeZone("Australia/Sydney");
        TimeZone gmtz = TimeZone.getTimeZone("GMT");
        Calendar datetime = Calendar.getInstance( gmtz );

        soapdatetime.setTimeZone( gmtz );
        String soap_datetime = soapdatetime.format( datetime.getTime() );
        System.out.println( soap_datetime );

        soapdatetime.setTimeZone( oztz );
        datetime.setTimeZone( oztz );
        try {
            datetime.setTime(
                    soapdatetime.parse( soap_datetime )
            );
        } catch (ParseException e) {
            e.printStackTrace();
        }

        soapdatetime.setTimeZone( gmtz );
        soap_datetime = soapdatetime.format( datetime.getTime() );
        System.out.println( soap_datetime );
    }
}
-1
ответ дан 1 December 2019 в 20:42
поделиться

Мне жаль того дурака, которому приходится делать свидания на Яве.

То, что вы сделали, почти наверняка пойдет не так во время перехода на летнее время. Лучший способ сделать это, вероятно, - создать новый объект Calendar, установить для него часовой пояс, а затем установить все поля индивидуально, так что год, месяц, день, час, минута, секунда, получая значения из объекта Date .

Изменить:
Чтобы все остались довольны, вам, вероятно, следует сделать следующее:

Calendar utcTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar sydneyTime = Calendar.getInstance(TimeZone.getTimeZone("Australia/Sydney");
utcTime.setTime(trade_date);
for (int i = 0; i < Calendar.FIELD_COUNT; i++) {
  sydneyTime.set(i, utcTime.get(i));
}

Тогда вы не будете использовать какие-либо устаревшие методы.

19
ответ дан 1 December 2019 в 20:42
поделиться

Однако я не уверен, что это решение также переходит на летнее время счет. Я думаю, что так и должно быть, потому что все операции выполняются по времени UTC.

Да, вы должны учитывать переход на летнее время, так как это влияет на смещение к UTC.

Есть ли опыт манипулирования временем в Java? Лучшие идеи о том, как решить эту проблему?

Joda-Time — это лучший API времени. Возможно, следующий фрагмент может быть помочь:

DateTimeZone zone; // TODO : get zone
DateTime fixedTimestamp = new DateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisOfSecond, zone);

Типы JodaTime неизменны, что также является преимуществом.

3
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: