Часовые пояса java

294
28 сентября 2017, 12:55

Добрый день! Мне нужно сделать программу, которая по названию города определяет его часовой пояс, используя стандартные библиотеки java. Может кто-то подсказать способ получить все названия часовых поясов. Спасибо.

Answer 1

Используйте TimeZone

Этот код

 TimeZone timeZone = TimeZone.getTimeZone("Asia/Singapore");
    System.out.println(timeZone.getID());
    System.out.println(timeZone.getRawOffset());
    System.out.println(timeZone.getDisplayName(false, TimeZone.LONG));
    System.out.println(timeZone.getDisplayName(false, TimeZone.SHORT));
    System.out.println(timeZone.getDisplayName(true, TimeZone.LONG));
    System.out.println(timeZone.getDisplayName(true, TimeZone.SHORT));

выдает

 Asia/Singapore
28800000
Singapore Time
SGT
Singapore Summer Time
SGST

Также еще можно так

DateTimeZone tz = DateTimeZone.forID("America/Winnipeg");
DateTime dt = new DateTime(tz);

Но для этого тебе нужны спец Айдишки их перечень можешь найти Отсюда

Или использовать готовые APi

Answer 2

То что вы просите, а именно:

Мне нужно чтобы пользователь к примеру вводил город "Москва" и программа выбивала ему время в Москве, напишет Варшава - должна в Варшаве

в общем случае, это довольно сложная задача...

Есть такая БД называется tz - она же zoneinfo, несмотря на кажущуюся тривиальность БД имеет довольно сложную структуру учитывающую всякие разные хотелки политиков, границы стран, летнее время, законодательство, исторические аспекты и проч. лабуду. Приведенная @elik API ZoneInfo по сути надстройка над частью TZ. Эту же БД понужают практически все кому не лень.

Так вот проблема в том, что TZ содержит:

Each location in the database represents a national region where all clocks keeping local time have agreed since 1970. Locations are identified by continent or ocean and then by the name of the location, which is typically the largest city within the region.

То есть в БД приведены только крупные города, если пользователь задаст скажем Бердичев или Урюпинск (а он рано или поздно задаст такой вопрос) - то TZ вам не поможет. Но не все так печально, ибо тот же TZ содержит в себе точные границы временных зон, так что если сделать привязку к какой-нибудь ГИС, то более-менее легко можно понять в какой временной зоне будет находиться тот же Бердичев или Урюпинск. К счастью, умные люди это уже давно сделали и выложили в качестве веб сервиса.

Например GeoNames или Google Time Zone

Так что читайте доки, узнавайте удивительный мир веб сервисов, форматов JSON и проч. истории - я вам прямо завидую.

Answer 3

Вот вариант решения:

public String getTime(String id, String name){
     TimeZone timezone;
     if(id == null || id.length() == 0){
         String[] ids = TimeZone.getAvailableIDs();
         String finalID = "";
         if(name != null) {
             String buffer = name.replace(' ', '_');
             for (String id : ids) {
                 if ( id.contains(buffer) ) {
                     finalID = id;
                     break;
                 }
             }
         }
         //если не найдено, то выведет время GMT+0
         timezone = TimeZone.getTimeZone(finalID);
     }
     else{
         timezone = TimeZone.getTimeZone(id);
     }
     Calendar calendar = Calendar.getInstance(timezone);
     DateFormat formatter = new SimpleDateFormat("HH:mm:ss z");
     formatter.setCalendar(calendar);
     formatter.setTimeZone(timezone);
     return formatter.format(calendar.getTime());
 }

Если ввести город, которого нет в списке часовых поясов, то выведет время GMT+0. И учти, что название города надо вводить только на английском. Например, Нью Йорк не найдет, а часовой пояс New York будет найден.

READ ALSO
Как сортировать HashMap по значениям?

Как сортировать HashMap по значениям?

Как сортировать HashMap по значениям?

415
автоматизация платежей android

автоматизация платежей android

планируем доску обьявлений для не очень большего городас реализацией то справляемся хотя и мы начинающие

288
JAVA открытие другого jframe при нажатии на jbutton

JAVA открытие другого jframe при нажатии на jbutton

Хочу, чтобы при нажатии на jbutton "Test epta" открывалось 2-ое окноРеализовал вот так, но так не работает )) Подскажите, что не так делаю

229
Закрытие JFrame

Закрытие JFrame

Есть JFrame, у него вроде как есть метод

225