Время Joda дает зону неправильного времени

Почему бы не использовать MAC-адрес Вашей сетевой платы?

13
задан JodaStephen 16 August 2013 в 18:04
поделиться

2 ответа

Хорошо, чтобы разобраться в этом, вы должны ознакомиться с тем, что на самом деле означает британское летнее время и когда оно было на месте. Чтобы сделать его короче, вы передаете 0L в getName () , который равен 1970-01-01T00: 00: 00Z , поэтому DefaultTimeZone ищет название часового пояса в данный момент. Это было британское летнее время.

Источник: http://www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

В 1968 году часы были продвинутый один час перед GMT 18 февраля и оставалось так до британского стандарта Время, в течение которого часы находились в продвижение по Гринвичу в течение всего года, вошло в силы с 27 октября 1968 г. по 31 г. Октябрь 1971 г.

Если бы вы вместо этого пропустили нужное количество миллисекунд с 1970-01-01T00: 00: 00Z . например, выполнив

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis())

, вы также получите правильную строку. По сути, вы просто загрузили метод getName () с неправильным параметром, что привело к неожиданному результату.

Если вы хотите подробно проверить, проверьте файлы в org / joda / time / tz / src источника joda, чтобы увидеть, как joda определяет часовые пояса.


Вместо

defaultTimeZone.getName(0L)

вы можете использовать

defaultTimeZone.toTimeZone().getDisplayName()

, который делает это за меня.

30
ответ дан 1 December 2019 в 20:29
поделиться

Возможно, вас заинтересует статический инициализатор для класса DateTimeZone в версии 1.6:

static {
    setProvider0(null);
    setNameProvider0(null);

    try {
        try {
            cDefault = forID(System.getProperty("user.timezone"));
        } catch (RuntimeException ex) {
            // ignored
        }
        if (cDefault == null) {
            cDefault = forTimeZone(TimeZone.getDefault());
        }
    } catch (IllegalArgumentException ex) {
        // ignored
    }

    if (cDefault == null) {
        cDefault = UTC;
    }
}

Я предполагаю, что у вас определено свойство user.timezone (и установлено в BST). В противном случае похоже, что Joda должен создать свой собственный экземпляр часового пояса на основе часового пояса JDK; и я ожидаю, что любые ошибки в этой области, особенно при преобразовании зоны по Гринвичу, уже будут обнаружены.

0
ответ дан 1 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: