2011-08-07 1 views
3
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

public class Main { 
    public static void main(String[] args) { 
     System.out.println(
       DateTimeZone.forID("Europe/Copenhagen") 
     ); 

     DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm dd MM YY Z"); 
     System.out.println(
       formatter.parseDateTime("19:30 29 8 11 Europe/Copenhagen") 
     ); 
    } 
} 

Я бы ожидать, что это разобрать дату в Копенгагенском часовом поясе, и все же он терпит неудачу с:Joda время часового пояса разбор с регионом/городом

Europe/Copenhagen 
Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "19:30 29 8 11 Europe/Copenhagen" is malformed at "Europe/Copenhagen" 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:683) 
    at Main.main(Main.java:13) 

Почему?

+0

@ Майкл-О: почему? – home

+1

Поскольку документы говорят: Зона: «Z» выдает смещение без двоеточия, «ZZ» выдает смещение с двоеточием, «ZZZ» или больше выдает идентификатор зоны. –

ответ

3

Глядя на JodaTime DateTimeFormat javadocs на DateTimeFormat, вы должны использовать ZZZ не Z.

Его легко пропустить, поскольку в таблице в этом документе отображается только Z. Вниз по странице это «Зона:« Z »выдает смещение без двоеточия,« ZZ »выводит смещение с помощью двоеточия,« ZZZ » 'или больше выводит идентификатор зоны. "

+0

Попытка ZZZ по-прежнему бросает для меня одно и то же исключение: «" Исключение в потоке "main" java.lang.IllegalArgumentException: Недопустимый формат: "19:30 29 8 11 Европа/Копенгаген" искажается в "Европе/Копенгагене" " –

+0

Hrmm. Я вижу, что в документе я ссылался на то, что «Названия зон: имена часовых поясов (« z ») не могут быть проанализированы». Возможно, Джода может вывести только зону, но не разобрать ее? – Freiheit

+0

Похоже, вам нужно выполнить некоторую предварительную обработку строки самостоятельно. http://joda-interest.219941.n2.nabble.com/Re-Parsing-short-timezones-td5786347.html. Его возможно, но не поддерживали год назад. – Freiheit

1

Решение я использую, который, кажется, работает до сих пор является:

public static void main(String[] args) { 
    DateTimeFormatter formatterC = DateTimeFormat.forPattern("HH:mm dd M YY").withZone(DateTimeZone.forID("Europe/Copenhagen")); 
    System.out.println(
     formatterC.parseDateTime("19:30 29 8 11") 
    ); 
} 
+0

Я думаю, что это как можно ближе. Вы можете написать регулярное выражение для разбора часового пояса, '/. *? \ /.*?/'. Затем подайте это в 'DateTimeZone.forId (strId)', чтобы проверить его. Наконец сделайте вызов, как вы делали выше, с остальной частью формата, плюс дополнительный 'withZone'. – Freiheit

2

Синтаксического времени идентификаторов зон, как Европа/Копенгаген был добавлен только в Joda-Time v2.0