неверный часовой пояс java
у меня есть экземпляр Java, который, кажется, совершенно неправильный часовой пояс. Вместо использования часового пояса Австралия/Сидней, который использует Windows, он использует часовой пояс Америка / Каракас.
Я сначала проверил время Windows через системные часы, затем проверил HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/
и ControlSet001
, ControlSet002
. Все они установлены в часовом поясе Сиднея.
кто-нибудь знает, является ли это ошибкой в Java, или если это относится к набору времени в другом месте?
версия Java 1.6.0_06
7 ответов
убедитесь, что вы установили часовой пояс для JVM при запуске приложения:
-Duser.timezone="Australia/Sydney"
проверьте информацию по следующей ссылке:
http://techtavern.wordpress.com/2010/04/15/java-and-incorrect-timezone-on-windows-xp/
Он показывает, что в JVM есть ошибка, вызывающая неправильное чтение часового пояса по умолчанию из реестра windows. Исправления ошибок пока нет.
попробуйте в своем приложении получить часовой пояс по умолчанию или установить часовой пояс вручную (прокомментированная строка).
мой маленький пример:
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Locale locale = Locale.getDefault();
TimeZone localTimeZone = TimeZone.getDefault();
//TimeZone localTimeZone = TimeZone.getTimeZone("Australia/Sydney");
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
dateFormat.setTimeZone(localTimeZone);
Date rightNow = new Date();
System.out.println(locale.toString() + ": " + dateFormat.format(rightNow));
}
}
недавно у меня была такая же проблема, по-видимому, это вызвано неоднозначностью того, как Windows представляет свои настройки часового пояса в реестре, и Java не может правильно интерпретировать его.
более подробную информацию можно найти в в этой статье, который также описывает "лечения" для затронутой машины:
- изменение даты / времени вручную, а затем изменение обратно в исходное правильное время.
- изменение часового пояса, а затем обратно в оригинальная.
- запрос автоматического обновления времени с сервера времени.
существует история таких проблем, которые приходят и уходят, и нет разумного решения. Подробнее здесь: Java ошибка неправильного часового пояса на Windows
Edit: отвечая том и Фрэнсис: вкратце, Java runtime имеет трудное время, выполняя работу по правильному выяснению текущего часового пояса на компьютере.
информация реестра Windows о часовых поясах была ненадежной, и то же самое для собственного API windows, который полагается на msvcrt.dll и различные msvcrxx.файл DLL. Существует также управляемый (.NET) API, который требует установки определенной версии .NET Framework, которая противоречит переносимости Java.
таким образом, у разработчиков Java runtime есть трудное время с текущим часовым поясом в Windows, и это может продолжаться до тех пор, пока у Microsoft не будет причин сотрудничать.
Если вы хотите, чтобы ваше приложение Java работало правильно в любом часовом поясе, дайте пользователям возможность исправить часовой пояс через GUI.
У меня была такая же ошибка, когда я устанавливал свой часовой пояс на стандартное время Малайского полуострова, JVM дал мне часовой пояс Венесуэлы.
для меня работает следующее исправление:
в редакторе реестра измените часовой пояс на другой часовой пояс (я пытался поместить другой текст, например "Сингапурское время". Вы можете найти реестр здесь:
раздел HKEY_LOCAL_MACHINE/системы/CurrentControlSet на/управление/TimeZoneInformation
и затем я сбросил его обратно на мой нужный часовой пояс с помощью Панели управления, настройки даты и времени. Когда я возвращаюсь к редактору реестра, я вижу, что он возвращается к стандартному времени Малайского полуострова. И теперь мой JVM читает его правильно...