Почему Java возвращает дату в GMT-4.5, когда выбирает Всемирный часовой пояс с часовым поясом в Windows? - PullRequest
5 голосов
/ 13 ноября 2009

Мы видели странную проблему на некоторых компьютерах с Windows XP, связанную с часовым поясом «Всемирное координированное время». Кажется, что не на всех компьютерах с Windows XP она есть, но на тех, у которых она есть, следующая простая программа на Java

public class TimeTest {
    public static void main(String[] args) {
        System.out.println(java.util.TimeZone.getDefault());
        System.out.println(new java.util.Date());
    }
}

на отпечатках JDK 1.6.0_06:

sun.util.calendar.ZoneInfo[id="America/Caracas",offset=-16200000,dstSavings=0,useDaylight=false,transitions=5,lastRule=null]
Fri Nov 13 05:34:14 VET 2009

(т.е. на 4 с половиной часа отстает от GMT). Я должен добавить, что я живу в Лондоне и никогда не был в Южной Америке. : -)

Мои вопросы:

  • Откуда Java получает этот часовой пояс? Я думал, что координированное всемирное время должно было стать новым названием для GMT.
  • Почему некоторые машины с Windows имеют этот часовой пояс, а другие нет?

Ответы [ 3 ]

3 голосов
/ 07 сентября 2012

Я видел Java, когда видел часовой пояс по стандартному венесуэльскому времени (VET), хотя Windows была установлена ​​для Pacific.Это было на недавно клонированной коробке VMWare.Как только я изменил часовой пояс с Pacific на другой, сохранил его, изменил обратно на Pacific, сохранил его, а затем перезапустил свое приложение Java, после чего Java распознала правильный часовой пояс.

0 голосов
/ 24 апреля 2010

У меня такая же проблема в Unix / Solaris. Команда date использует переменную Time / Zome, когда команда подобна этой "date -u 042315232010". Если вы используете параметр -u, то в качестве даты команды используется переменная с именем TZ, и она позволяет отрегулировать время по Гринвичу относительно времени в TZ. Для их решения используйте команду «дата 042315232010» и все сработало. Возможно, вам следует избегать предложений TimeZone в вашей Java-программе. Кстати, «дата 042315232010» означает «Пт 23 апреля 15:23:00 VET 2010».

0 голосов
/ 13 ноября 2009

Распечатывает его, используя часовой пояс по умолчанию. Ваш субъект говорит о «выборе» UTC, но я не вижу такого выбора в вашей программе. Если вы выбрали его где-то еще, пожалуйста, укажите детали точно где. Если вы изменили часовой пояс XP, вы можете попробовать перезагрузить компьютер - возможно, ваш Java-код откуда-то получает кэшированное значение.

Распечатайте java.util.TimeZone.getDefault и я подозреваю, что вы увидите VET на машинах с проблемой.

Если вы хотите, чтобы ваш код использовал UTC, вы должны указать это явно ... предпочтительно используя Joda Time вместо встроенных Date / Calendar классов.

РЕДАКТИРОВАТЬ: Если у вас есть .NET 3.5 на тех же машинах, попробуйте эту маленькую программу, чтобы увидеть, что это считает, что часовой пояс:

using System;

class Test
{
    static void Main()
    {
        Console.WriteLine(TimeZoneInfo.Local.DisplayName);
    }
}
...