我最近遇到过Joda,但在解析LocalTime
时遇到了麻烦,如一个简单的代码片段所示:
String localTimeString = LocalTime.now().toString(dateTimeFormatter);
LocalTime localTime = LocalTime.parse(localTimeString, dateTimeFormatter);
结果根据使用的DateTimeFormatter
而有所不同:
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss");
DateTimeFormatter dateTimeFormatter = DateTimeFormat.longTime();
我对结果感到惊讶:
localTimeString
的值为13:23:45
,并且正确打印出经过解析的localTimeString
会正确地13:23:45.000
。我在这里挣扎。 localTimeString
是1:23:45 PM
,但是以下行导致异常:
java.lang.IllegalArgumentException:无效格式:“ 1:23:45 PM”太短
我没有发现任何类似的问题,Joda JavaDoc也没有帮助我。
为什么DateTimeFormat::longTime
无法自我解析?我想我做错了什么?
答案 0 :(得分:1)
我不太了解Joda-Time,但我猜想听起来像是我的耳朵。我尝试过:
DateTimeFormatter dateTimeFormatter
= DateTimeFormat.longTime().withLocale(Locale.US);
String timeString = DateTime.now().toString(dateTimeFormatter);
System.out.println("timeString: \"" + timeString + '"');
在欧洲/哥本哈根时区的计算机上,它刚刚打印:
timeString:“美国东部标准时间下午3:19:09”
因此,DateTimeFormat.longTime()
似乎包含时区缩写(此处为中欧夏令时的CEST)。因此,显然在您的代码中发生的是:
LocalTime
不包含时区,因此其toString
方法使用空字符串作为时区的缩写来格式化时间。它确实包括了时间与时区缩写应该在的位置之间的间隔。除了您引用(以及我在此处复制时)之外,PM
后还有一个空格。LocalTime.parse
更为严格,它反对字符串中没有时区缩写。