我在我的應用程序中使用JSR 310 DateTime API *,我需要解析和格式化軍用日期時間(稱爲DTG或「日期時間組」)。軍事時區使用JSR 310(DateTime API)
格式我解析看起來像這樣(使用DateTimeFormatter
):
"ddHHmm'Z' MMM yy" // (ie. "312359Z DEC 14", for new years eve 2014)
這種格式是很容易如上所述解析。例如'A'(阿爾法,UTC + 1:00)或'B'(布拉沃,UTC +格林威治標準時間),日期包含與'Z'不同的時區時(Zulu時區,與UTC/GMT相同) 2:00)。完整列表請參見Military time zones。
我該如何解析這些時區?或者換句話說,我可以用上面的格式'Z'以外的格式來解析所有區域嗎?我曾嘗試使用"ddHHmmX MMM yy"
,"ddHHmmZ MMM yy"
和"ddHHmmVV MMM yy"
,但它們都不起作用(在解析時,上述示例均會產生DateTimeParseException: Text '312359A DEC 14' could not be parsed at index 6
)。不允許在格式中使用單個V
(嘗試實例化DateTimeFormatter
時爲IllegalArgumentException
)。
編輯:看起來符號z
可以工作,如果它不是爲了下面的問題。
我還應該提到,我已經創建了一個ZoneRulesProvider
與所有命名的區域和正確的偏移量。我已經驗證了這些使用SPI機制正確註冊,並且我的provideZoneIds()
方法按預期調用。仍然不會解析。作爲一個側面問題(編輯:現在似乎是主要問題),API以外的單字符時區id(或「區域」)不允許使用。
例如:
ZoneId alpha = ZoneId.of("A"); // boom
將拋出DateTimeException: Invalid zone: A
(甚至沒有訪問我的規則,供應商,看看它的存在)。
這是API中的疏忽嗎?或者我做錯了什麼?
*)其實,我使用的Java 7和ThreeTen Backport,但我不認爲事項這個問題。
PS:我目前的解決辦法是使用25個不同的DateTimeFormatter
s的文字區域ID(即"ddHHmm'A' MMM yy"
,"ddHHmm'B' MMM yy"
等),使用RegExp
提取區域ID,並委託給基於區域的正確格式。提供商的區域ID被命名爲「Alpha」,「Bravo」等,以允許ZoneId.of(...)
找到區域。有用。但它不是很優雅,我希望有更好的解決方案。
您是否嘗試過在格式字符串(即「ddHHmmV MMM yy」'')中爲zone-id使用'V'? AFAIK''Z''只是'Z'字符。 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html – 2015-01-21 11:10:36
是的,我明白'Z''是一個文字,不會被解析器解釋。 'Z'(無引號)雖然是一個符號(但不起作用)。是的,我嘗試了'V'。儘管...嘗試創建格式化程序時出現'IllegalArgumentException:模式字母計數必須爲2:V',它會給出不同的錯誤。使用'VV',我可以回到解析時的「...無法在索引6解析」異常。不管怎麼說,還是要謝謝你! :-) – haraldK 2015-01-21 11:18:26
@PavelHoral實際上,它似乎是「正確的」符號是'z'(小寫)...這似乎正確解析區域,但當然它爆炸,因爲單字母區域是不允許的..: -P「'...無法解析:無效區域:A'」。我會更新這個問題...... – haraldK 2015-01-21 11:24:02