Я получаю datetime из веб-службы SOAP без информации о тимзоне. Следовательно, десериализатор оси принимает UTC. Тем не менее, дата-время действительно находится в Сиднее. Я решил эту проблему путем вычитания смещение часового пояса:Изменение часового пояса без изменения времени в Java
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? Лучшие идеи о том, как решить эту проблему?
Я всегда, когда-либо, и только манипулировать датой (на любом языке), используя только фиксированный блок. Этот блок является вторым (или миллисекундой). Есть минуты с 59 или 61 секундой, и есть дни с 23 или 25 часами. Есть часы с 60 * 60 +/- 1 секунд и т. Д. Все мои даты хранятся в виде (миллисекунд) секунд с эпохи. Вот как они находятся в БД, вот как они сортируются. Единственный раз, когда я делаю часовой пояс/yyyy-mm-dd любого преобразования, когда он должен отображаться пользователю (или при использовании сломанных API, которые не понимают, что дата выражается в секундах). – SyntaxT3rr0r
@WizardOfOdds. Это звуковой совет, но OP четко сообщил, что он получает временную метку из веб-службы (возможно, стороннюю сторону) и использовал стороннюю библиотеку для обработки этого запроса. Ясно, что есть некоторые вещи из его прямого контроля, и переход от часового пояса к часовому поясу определенно не прямо с java.util.Calendar. –
Спасибо за ваши комментарии. Я создаю заглушки веб-службы из файла WSDL с помощью Axis. Я использую сгенерированные классы для подключения к стороннему веб-сервису. На самом деле, они должны передавать поля datetime с информацией о часовом поясе или в UTC, что и ожидает Axis. Но это не мой выбор. – 2010-05-20 13:30:46