Я получаю дату и время от веб-сервиса 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? Лучшие идеи о том, как решить эту проблему?
Я решил переанализировать полученную строку 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 );
}
}
Мне жаль того дурака, которому приходится делать свидания на Яве.
То, что вы сделали, почти наверняка пойдет не так во время перехода на летнее время. Лучший способ сделать это, вероятно, - создать новый объект 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));
}
Тогда вы не будете использовать какие-либо устаревшие методы.
Однако я не уверен, что это решение также переходит на летнее время счет. Я думаю, что так и должно быть, потому что все операции выполняются по времени UTC.
Да, вы должны учитывать переход на летнее время, так как это влияет на смещение к UTC.
Есть ли опыт манипулирования временем в Java? Лучшие идеи о том, как решить эту проблему?
Joda-Time — это лучший API времени. Возможно, следующий фрагмент может быть помочь:
DateTimeZone zone; // TODO : get zone
DateTime fixedTimestamp = new DateTime(year, monthOfYear, dayOfMonth, hourOfDay, minuteOfHour, secondOfMinute, millisOfSecond, zone);
Типы JodaTime неизменны, что также является преимуществом.