Подтвердить что ты не робот

Идентификатор TimeZone в Java

У меня возникла странная проблема с java TimeZone..

Вызов TimeZone.getDefault() дает мой локальный часовой пояс с идентификатором "GMT + 02: 00". Смешно, что этот идентификатор не отображается в списке, представленном TimeZone.getAvailableIDs(). Очевидно, моя зона выглядит как "Etc/GMT + 2".

Я пытаюсь заполнить комбо с часовыми поясами, но невозможно поставить выбор, потому что GMT + 02: 00 нет в списке. Кто-нибудь видел эту проблему? Любые идеи?


Update:

Нижняя строка - не может полагаться на строки ID, должна идти со смещением, так как идентификатор отображения может отличаться от системы к системе.

4b9b3361

Ответ 1

Оглядываясь на некоторые другие вопросы SO, это, похоже, проблема Java-on-Windows. Пожалуйста, посмотрите эту статью, особенно ответ 1, в котором указывается ссылка на wikipedia, которая может решить проблему с отображением.

Ответ 2

GMT + 02: 00 - это пользовательский идентификатор, он не будет отображаться на выходе TimeZone.getAvailableIDs() (который огромен). Что вы можете сделать, так это попросить пользователя сначала указать его смещение, а затем получить доступные идентификаторы для данного смещения. Например, для GMT + 02: 00 следующий фрагмент кода:

for (String string : TimeZone.getAvailableIDs(TimeZone.getTimeZone(
        "GMT+02:00").getRawOffset())) {
    System.out.println(string);
}

дает следующий результат:

ART
Africa/Blantyre
Africa/Bujumbura
Africa/Cairo
Africa/Gaborone
Africa/Harare
Africa/Johannesburg
Africa/Kigali
Africa/Lubumbashi
Africa/Lusaka
Africa/Maputo
Africa/Maseru
Africa/Mbabane
Africa/Tripoli
Asia/Amman
Asia/Beirut
Asia/Damascus
Asia/Gaza
Asia/Istanbul
Asia/Jerusalem
Asia/Nicosia
Asia/Tel_Aviv
CAT
EET
Egypt
Etc/GMT-2
Europe/Athens
Europe/Bucharest
Europe/Chisinau
Europe/Helsinki
Europe/Istanbul
Europe/Kaliningrad
Europe/Kiev
Europe/Mariehamn
Europe/Minsk
Europe/Nicosia
Europe/Riga
Europe/Simferopol
Europe/Sofia
Europe/Tallinn
Europe/Tiraspol
Europe/Uzhgorod
Europe/Vilnius
Europe/Zaporozhye
Israel
Libya
Turkey

В этот раз все еще большой, но доступный для человека.

Ответ 3

java.time.ZoneId

TimeZone является частью проблемных старых классов времени, которые теперь являются устаревшими, вытесняются классами java.time.

В вашем случае посмотрите ZoneId и ZoneOffset. Смещение-от-UTC - это количество часов и минут. Часовой пояс - это история прошлых, настоящих и будущих смещений, используемых регионом в разные периоды времени.

Получить коллекцию всех известных зон через ZoneId.getAvailableZoneIds. Убедитесь, что ваша JVM обновлена ​​достаточно недавно с информацией обо всех часовых поясах, в которых у вас есть интерес. У политиков есть удивительная склонность к часто меняющимся определениям зон, часто с небольшим предупреждением.

Set < String > ids = ZoneId.getAvailableZoneIds() ;

По состоянию на Java 8 Update 144.

[Азия/Аден, Америка/Куяба, Etc/GMT + 9, Etc/GMT + 8, Африка/Найроби, Америка/Мариго, Азия/Актау, Тихий океан/Кваджалейн, Америка/Эль-Салвадор, Азия/Понтианак, Африка/Каир, Тихий океан/Паго_Паго, Африка/Мбабане, Азия/Кучинг, Тихий океан/Гонолулу, Тихий океан/Раротонга, Америка/Гватемала, Австралия/Хобарт, Европа/Лондон, Америка/Белиз, Америка/Панама, Азия/Чунцин, Америка/Манагуа, Америка/Индиана/Петербург, Азия/Ереван, Европа/Брюссель, GMT, Европа/Варшава, Америка/Чикаго, Азия/Кашгар, Чили/Континенталь, Тихий океан/Яп, CET, Etc/GMT-1, Etc/GMT-0, Европа/Джерси, Америка/Тегусигальпа, Etc/GMT-5, Европа/Стамбул, Америка/Эйрунепе, Etc/GMT-4, Америка/Микелон, Etc/GMT-3, Европа/Люксембург и т.д. /GMT -2, GMT-9, Америка/Аргентина/Катамарка, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Европа/Запорожье, Канада/Юкон, Канада/Атлантика, Атлантик/Сент-Хелена, Австралия/Тасмания, Ливия, Европа/Гернси, Америка/Гранд_Турк, США/Тихоокеанский регион, Азия/Самарканд, Америка/Аргентина/Кордова, Азия/Пномпень, Африка/Кигали, Азия/Алмат y, США/Аляска, Азия/Дубай, Европа /Isle _of_Man, Америка/Арагуайна, Куба, Азия/Новосибирск, Америка/Аргентина/Сальта, Etc/GMT + 3, Африка/Тунис, и т.д. /GMT + 2, Etc/GMT + 1, Тихоокеанский регион/Факаофо, Африка/Триполи, Etc/GMT + 0, Израиль, Африка/Банджул, и т.д. /GMT + 7, Индийский/Коморо, Etc/GMT + 6, Etc/GMT + 5, Etc/GMT + 4, Тихий океан/Порт-Морсби, США/Аризона, Антарктика/Сева, Индийская/Реюньон, Тихий океан/Палау, Европа/Калининград, Америка/Монтевидео, Африка/Виндхук, Азия/Карачи, Африка/Могадишо, Австралия/Перт, Бразилия /, Азия/Чита, Тихий океан/Пасха, Антарктида/Дэвис, Антарктика/МакМердо, Азия/Макао, Америка/Манаус, Африка/Фритаун, Европа/Бухарест, Азия/Томск, Америка/Аргентина/Мендоса, Азия/Макао, Европа/Мальта, Мексика/БаджаСур, Тихий океан/Таити, Африка/Асмэра, Европа/Бусинген, Америка/Аргентина/Рио_Галлегос, Африка/Малабо, Европа/Скопье, Америка/Катамарка, Америка /Godthab, Европа/Сараево, Австралия /ACT, GB- Эйр, Африка/Лагос, Америка/Кордова, Европа/Рим, Азия/Дакка, Индийский/Маврикий, Тихий океан/Самоа, Америка/Регина, Америка /Fort _Wayne, Америка/Dawson_Creek, Африка/Алжир, Европа/Мариехамн, Америка /St _Johns, Америка/St_Thomas, Европа/Цюрих, Америка/Ангилья, Азия/Дили, Америка/Денвер, Африка/Бамако, Европа/Саратов, Мексика/Генерал, Тихий океан/Уоллис, Европа/Гибралтар, Африка/Конакри, Африка/Лубумбаши, Азия/Стамбул, Америка/Гавана, NZ-CHAT, Азия/Чойбалсан, Америка/Порто_Акре, Азия/Омск, Европа/Вадуц, Мичиган, Азия/Дакка, Америка/Барбадос, Европа/Тирасполь, Атлантик/Кейп-Верде, Азия/Екатеринбург, Америка/Луисвилл, Тихий океан/Джонстон, Тихий океан/Чатем, Европа/Любляна, Америка/Сао_Пауло, Азия/Джаяпура, Америка/Кюрасао, Азия/Душанбе, Америка/Гайана, Америка/Гуаякиль, Америка/Мартиника, Португалия, Европа/Берлин, Европа/Москва, Европа/Кишинэу, Америка/Пуэрто-Рико, Америка /Rankin _Inlet, Тихий океан/Понапе, Европа/Стокгольм, Америка/Аргентина/Жужуй, Австралия /Eucla, Азия/Шанхай, Universal, Европа/Загреб, Америка /Port _of_Spain, Европа/Хельсинки, Азия/Бейрут, Азия/Тель-Авив, Тихий океан/Бугенвиль, США/Центральная Африка /Sao _Tome, Индия/Чагос, Америка/Кайенна, Азия/Якутск, Тихий океан/Галапагос, Австралия/Север, Европа/Париж, Африка/Нджамена, Тихий океан/Фиджи, Америка /Rainy _River, Индийский/Мальдивские острова, Австралия/Яньковинна, SystemV/AST4, Азия/Орал, Америка/Йеллоунайф, Тихий океан/Эндербери, Америка/Джуно, Австралия/Виктория, Америка/Индиана/Вевей, Азия/Ташкент, Азия/Джакарта, Африка/Сеута, Азия/Барнаул, Америка/Ресифи, Америка/Буэнос-Айрес, Америка/Норонха, Америка /Swift _Current, Австралия/Аделаида, Америка/Метлакатла, Африка/Джибути, Америка/Парамарибо, Европа/Симферополь, Европа/София, Африка/Нуакшот, Европа/Прага, Индиана/Венсен, Антарктида/Моусон, Америка/Кралендейк, Антарктида/Тролль, Европа/Самара, Индийский/Рождество, Америка/Антигуа, Тихий океан/Гамбьер, Америка/Индианаполис, Америка/Инувик, Америка/Икалуит, Тихий океан/Фунафути, UTC, Антарктика/Маккуори, Канада/Тихий океан, Америка/Монктон, Африка/Габороне, Тихий океан/Чуук, Азия/Пхеньян, Америка/Сент-Винсент, Азия/Газа, Азия/Кайсалорда, Канада/Ньюфаундленд, Америка/Кентукки/Луисвилл, Америка/Якутат, Азия /Ho _Chi_Minh, Антарктида/Кейси, Европа/Копенгаген, Африка/Асмэра, Атлантик/Азорские острова, Европа/Вена, Южная Корея/Австралия, Австралия, Австралия, Канада, Австралия, Австралия, Австралия, Австралия, Австралия, Австралия, Австралия, Кипр, Австралия/Абиджан, Америка/Мендоса, Америка/Сантарем, Кваджалейн, АТихоокеанский регион/Океания, Атлантический океан/Бермудские острова, Америка/Коста-Рика, Америка/Доусон, Азия/Чунцин, Эйр, Европа/Амстердам, Азия/Улан-Батор, Новая Зеландия, Америка/Индиана/Нокс, Америка/Северная_Дакота/Беулах, Африка/Аккра, Атлантик/Фарерские острова, Мексика/БахаНорте, Америка/Масейо, Эт /UCT, Тихий океан/Апиа, GMT0, Америка/Атка, Тихий океан/Ниуэ, Канада/Саскачеван, Австралия /Lord _Howe, Европа/Дублин, Тихий океан/Трук, MST7MDT, Америка/Монтеррей, Америка/Нассау, Америка/Ямайка, Азия/Бишкек, Америка/Атикокан, Атлантик/Стэнли, Австралия /NSW, США/Гавайи, SystemV/CST6, Индия/Махе, Азия/Актобе, Америка/Ситка, Азия/Владивосток, Африка/Либревиль, Африка/Мапуту, Зулу, Америка/Кентукки/Монтичелло, Африка/Эль-Аайюн, Африка/Уагадугу, Америка/Корал-Харбор, Тихий океан/Маркизас, Бразилия/Запад, Америка/Аруба, Америка/Северная_Дакота/Центр, Америка/Кайман, Азия/Улан-Батор, Азия/Багдад, Европа/Сан-Марино, Америка/Индиана/Tell_City, Америка/Тихуана, Тихий океан/Сайпан, YST9, Африка/Дуала, Америка/Чихуахуа, Америка/Ожинага, Азия/Ховд, Америка/Анкоридж, Чили/Пасхальная неделя, Америка/Галифакс, Антарктида/Ротере, Америка/Индиана/Индианаполис, США/Гора, Азия/Дамаск, Америка/Аргентина/Сан-Луис, Америка/Сантьяго, Азия/Баку, Америка/Аргентина/Ушуайя, Атлантик/Рейкьявик, Африка/Браззавиль, Африка/Порто-Ново, Америка/Ла-Паз, Антарктика/ДюмонДурвилль, Азия/Тайбэй, Антарктида/Южный_Поле, Азия/Манила, Азия/Бангкок, Африка /Dar _es_Salaam, Польша, Атлантик/Мадейра, Антарктида/Палмер, Америка /Thunder _Bay, Африка/Addis_Ababa, Азия/Янгон, Европа/Ужгород, Бразилия/ДеНоронья, Азия/Ашхабад, Etc/Zulu, America/США/Самоа, КНР, Азия/Вьентьян, Тихий океан/Киритимати, Америка/Матаморос, Америка/Бранк-Айленд, Америка/Саблин, Азия/Эр-Рияд, Исландия, Тихоокеанский регион/Понпеи, Азия /Ujung _Pandang, Атлантик/Юг_Горгия, Европа/Лиссабон, Азия/Харбин, Европа/Осло, Азия/Новокузнет Азия/Кувейт, SystemV/HST10, Тихий океан/Эфате, Африка/Ломе, Америка/Богота, Америка/Меномине, Америка/Адак, Тихий океан/Норфолк, Европа/Киров, Америка/Резолют, Тихоокеанский регион/Тарава, Африка/Кампала, Азия/Красноярск, Гринвич, SystemV/EST5, Америка/Эдмонтон, Европа/Подгорица, Австралия/Юг, Канада/Центральная, Африка/Бужумбура, Америка/Санто_Доминго, США/Минск, Тихоокеанский регион/Окленд, Африка/Касабланка, Америка /Glace _Bay, Канада/Восточная Азия/Катар, Европа/Киев, Сингапур, Азия/Магадан, SystemV/PST8, Америка/Порт-о-Пренс, Европа/Белфаст, Сент-Бартхелеми, Азия/Ашхабад, Африка/Луанда, Америка/Нипигон, Атлантик/Ян_Майен, Бразилия/Акко, Азия/Маскат, Азия/Бахрейн, Европа/Вильнюс, Америка/Форталеза, и т.д. /GMT 0, США/Восточная Индиана, Австралия/Сидней, Америка/Лима, Австралия /LHI, Америка/St_Lucia, Европа/Мадрид, Америка/Баия_Бандерас, Америка/Канкун, Африка/Масеру, Тихий океан/Косра, Африка/Киншаса, Азия/Катманду, Азия /Amer ica/Montserrat, Asia/Brunei, America/Santa_Isabel, Канада/Гора, Америка /Cambridge _Bay, Азия/Коломбо, Австралия/Запад, Индийская/Антананариву, Австралия/Брисбен, Индийская/Майотта, США/Индиана-Старк, Азия/Урумчи, США/Алеут, Европа/Волгоград, Америка /Lower _Princes, Америка/Ванкувер, Африка/Блантир, Америка/Рио-Бранко, Америка/Дэнмарксхавн, Америка/Детройт, Америка/Туле, Африка/Лусака, Азия/Гонконг, Иран, Америка/Аргентина/La_Rioja, Африка/Дакар, SystemV/CST6CDT, Америка/Тортола, Америка /Porto _Velho, Азия/Сахалин, Etc/GMT + 10, Америка /Scoresbysund, Азия/Камчатка, Азия/Тхимбу, Африка/Хараре, Etc/GMT + 12, Etc/GMT + 11, Навахо, Америка/Ном, Европа/Таллинн, Турция, Африка/Хартум, Африка/Йоханнесбург, Африка/Банги, Европа/Белград, Ямайка, Африка/Бисау, Азия/Тегеран, WET, Европа/Астрахань, Африка/Джуба, Америка/Кампо_Гранде, Америка/Белен, Эт/Гринвич, Азия/Сайгон, Америка/Энсенада, Тихий океан/Мидуэй, Америка/Жужуй, Африка/Тимбукту, Америка/Баия, Америка/Гусе_Бей, Америка/Дева, Америка ca/Pangnirtung, Азия/Катманду, Америка/Феникс, Африка/Ниамей, Америка/Уайтхорс, Тихий океан/Нумеа, Азия/Тбилиси, Америка/Монреаль, Азия/Макассар, Америка/Аргентина/Сан-Джуан, Гонконг, UCT, Азия/Никозия, Америка/Индиана/Winamac, SystemV/MST7MDT, Америка/Аргентина/ComodRivadavia, Америка /Boa _Vista, Америка/Гренада, Азия/Атырау, Австралия/Дарвин, Азия/Хандыга, Азия/Куала_Люмпур, Азия/Фамагуста, Азия/Тхимпху, Азия/Рангун, Европа/Братислава, Азия/Калькутта, Америка/Аргентина/Тукуман, Азия/Кабул, Индийian/Cocos, Japan, Pacific/Tongatapu, America/New_York, Etc/GMT-12, Etc/GMT-11, Etc/GMT-10, SystemV/YST9YDT, Европа/Ульяновск, Etc/GMT-14, Etc/GMT- 13, W-SU, Америка/Мерида, EET, Америка/Росарио, Канада/Саскачеван, Америка /St _Kitts, Арктика/Лонгйир, Америка/Форт-Нилсон, Америка/Каракас, Америка/Гваделупа, Азия/Хеврон, Индийский/Кергелен, PST8PDT, Африка/Монровия, Азия/Усть-Нера, Египет, Азия/Среднегорск, Америка/Северная_Дакота/Нью_Салем, Азия/Анадырь, Австралия/Мельбурн, Азия/Иркутск, Америка/Широк, Америка/Виннипег, Европа/Ватикан, Азия /Amman, Etc/UTC, SystemV/AST4ADT, Азия/Токио, Америка/Торонто, Азия/Сингапур, Австралия/Линдеман, Америка /Los _Angeles, SystemV/EST5EDT, Тихий океан/Маджуро, Америка/Аргентина/Буэнос-Айрес, Европа/Никозия, Гуадалканал, Европа/Афины, США/Тихоокеанский регион, Европа/Монако]

Получите ваши JVM текущие часовой пояс по умолчанию.

ZoneId z = ZoneId.systemDefault() ; 

Америка/Los_Angeles

Помните, что значение JVM по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM. Как правило, лучше указать желаемый/ожидаемый часовой пояс, а не полагаться на системный по умолчанию.

Укажите имя текущего часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, например EST или IST, поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;

Если вы хотите знать смещение в игре в определенный момент для определенной зоны, спросите через объект ZoneRules.

ZoneOffset offsetInEffectNow = z.getRules().getOffset( Instant.now() );

Посмотрите все вышеперечисленное code run live на IdeOne.com.

Нижняя строка - не может полагаться на строки ID, должна идти со смещением, так как идентификатор отображения может отличаться от системы к системе.

Нет, идентификаторы часовых поясов документированы и согласованы. См. этот список в Википедии, отслеживаемый IANA.

Я не знаю много о том, что делал TimeZone, но, как и все остальные устаревшие классы времени, это может быть неправильно разработано. Также не знаете, как была настроена ваша ОС хоста и JVM. Трудно диагностировать, поскольку вы не предоставили достаточно информации.


О java.time

Структура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятный старый legacy классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

ThreeTen-Extraпроект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.

Ответ 4

Как насчет использования TimeZone.getAvailableIDs() и группировать их по части перед косой чертой и сделать ее двухступенчатой?

Ответ 6

Любой часовой пояс может быть указан как "GMT" плюс/минус смещение. timezone doc ссылается на это как на "пользовательский идентификатор".

Чтобы заполнить раскрывающийся список, я думаю, вам будет лучше придумать определенный список городов/смещений с привязкой к часовому поясу. Массив, возвращаемый getAvailableIDs(), огромен - 586 записей в моей установке - и вы определенно не хотите, чтобы ваши пользователи могли пробираться через это.

Ответ 7

UTC не GMT. Когда люди (включая Java образованные инженерные) начинают понимать это. GMT У вас есть летнее время (да!) UTC никогда не меняется (!). Я бы подумал, что все должны знать об этом точно так же, как правило високосного года или прыжок.