2015-10-27 2 views
0

У меня есть следующие инструкции:Java: getTimeZone без возврата значения по умолчанию

TimeZone zone = TimeZone.getTimeZone("Asia/Toyo"); 

Очевидно, что он должен вернуть нулевым, но он будет возвращать TimeZone по умолчанию, который не является желаемым поведением для моего случая. From Java Doc:

Возвращает указанные TimeZone или зону GMT, если данный идентификатор не может быть понят.

Есть ли способ получить соответствующее значение TimeZone и null, если строка не указывает действительный TimeZone?

Я не нашел хорошего решения, чтобы получить все TimeZones и перебрать их.

+0

Вместо повторного использования всех доступных tzids вы можете рассмотреть результат, только если это GMT. Если это так, проверьте, соответствуют ли ваши данные «GMT» или «UTC» или «UT» или «GMT0» или тому подобное. Если да, то ok else возвращает null. –

ответ

1

Это должно ответить на ваши потребности TimeZone validation in Java

String[] validIDs = TimeZone.getAvailableIDs(); 
for (String str : validIDs) { 
     if (str != null && str.equals("yourString")) { 
     System.out.println("Valid ID"); 
     } 
} 
+0

Я знаю, что вы только что скопировали ответ, но думаете ли вы, что 'getAvailableIDs()' вернет нулевое значение? – Andreas

+0

getAvailableIDs() не вернет нулевое значение, но это позволит вам узнать, является ли часовой пояс действительным (это было частью его вопроса). – Florian

+0

Я имел в виду проверку 'str! = Null'. – Andreas

2

Вместо переборе вы также можете просто использовать:

boolean exists = Arrays.asList(TimeZone.getAvailableIDs()).contains("Asia/Toyo"); 

или:

boolean exists = Arrays.stream(TimeZone.getAvailableIDs()).anyMatch("Asia/Toyo"::equals); 

Если вам нужно сделать это часто, добавление доступных идентификаторов в HashSet было бы более эффективным.

0

Просто проверить возвращаемый TimeZone:

public static TimeZone getTimeZone(String timeZoneID) { 
    TimeZone timeZone = TimeZone.getTimeZone(timeZoneID); 
    if (timeZone.getID().equals(timeZoneID)) 
     return timeZone; 
    throw new IllegalArgumentException("Unknown time zone: " + timeZoneID); 
} 

В Java 8, используйте новый ZoneId.of(String zoneId), который подведет неизвестных часовых поясов, и TimeZone.getTimeZone(ZoneId zoneId) если вам нужен старый TimeZone:

ZoneId zoneId = ZoneId.of("Asia/Toyo"); 
TimeZone timeZone = TimeZone.getTimeZone(zoneId); 
+0

[документация для TimeZone] (http://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html) явно указывает, что возвращаемый объект может иметь строку идентификатора, отличную от того, что вы запрашиваете, например 'TimeZone.getTimeZone (« GMT-8 »)'. – VGR

+0

@VGR Верно, но другие ответы, которые ищут доступные идентификаторы, будут сбой по той же причине. Нестандартный идентификатор будет изменен и не будет в списке. Таким образом, это лучшее, но все же несовершенное решение. – Andreas

0

java.time.ZoneId

Старые классы времени-времени теперь являются устаревшими, вытесняются классами java.time.

Вместо java.util.TimeZone вы должны использовать ZoneId. Для разбора proper time zone name позвоните по телефону ZoneId.of. Если имя, которое вы передаете в нераспознанном состоянии, метод выбрасывает ZoneRulesException.

Таким образом, чтобы получить орфографическую ошибку Asia/Tokyo как Asia/Toyo, ловушка для ZoneRulesException.

ZoneId z; 
try { 
    z = ZoneId.of ("Asia/Toyo"); // Misspell "Asia/Tokyo" as "Asia/Toyo". 
} catch (ZoneRulesException e) { 
    System.out.println ("Oops! Failed to recognize your time zone name. ZoneRulesException message: " + e.getMessage()); 
    return; 
} 
ZonedDateTime zdt = ZonedDateTime.now (z); 

См. Это code run live at IdeOne.com.


О java.time

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

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

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

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

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

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