неверный часовой пояс 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. Исправления ошибок пока нет.


вы должны обновить ваш JRE / SDK, а TZUpdater может быть достаточным.


попробуйте в своем приложении получить часовой пояс по умолчанию или установить часовой пояс вручную (прокомментированная строка).

мой маленький пример:

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 читает его правильно...