Utilizzo l'API DateTime JSR 310 * nella mia applicazione e ho bisogno di analizzare e formattare i tempi delle date militari (noti come DTG o "gruppo data ora").Fusi orari militari utilizzando JSR 310 (API DateTime)
Il formato sto parsing si presenta così (con DateTimeFormatter
):
"ddHHmm'Z' MMM yy" // (ie. "312359Z DEC 14", for new years eve 2014)
Questo formato è abbastanza facile da analizzare come descritto sopra. Il problema sorge quando le date contengono un fuso orario diverso da "Z" (fuso orario Zulu, uguale a UTC/GMT), ad esempio "A" (Alfa, UTC + 1: 00) o "B" (Bravo, UTC + 2:00). Vedere Military time zones per l'elenco completo.
Come posso analizzare questi fusi orari? O in altre parole, cosa posso inserire nel formato sopra diverso dalla "Z" letterale per far sì che analizzi correttamente tutte le zone? Ho provato a utilizzare "ddHHmmX MMM yy"
, "ddHHmmZ MMM yy"
e "ddHHmmVV MMM yy"
, ma nessuno di essi funziona (tutto getterà DateTimeParseException: Text '312359A DEC 14' could not be parsed at index 6
per l'esempio sopra, durante l'analisi). L'utilizzo di un singolo V
nel formato non è consentito (IllegalArgumentException
quando si tenta di creare un'istanza DateTimeFormatter
).
Modifica: Sembra che il simbolo z
avrebbe potuto funzionare, se non fosse stato per il problema di seguito.
Vorrei anche ricordare che ho creato uno ZoneRulesProvider
con tutte le zone denominate e l'offset corretto. Ho verificato che questi sono registrati correttamente utilizzando il meccanismo SPI e il mio metodo provideZoneIds()
viene richiamato come previsto. Ancora non si analizzerà. Come problema collaterale (Modifica: questo sembra essere il problema principale), l'ID del fuso orario a carattere singolo (o "regioni") diverso da "Z" non è consentito dall'API.
Ad esempio:
ZoneId alpha = ZoneId.of("A"); // boom
getterà DateTimeException: Invalid zone: A
(senza nemmeno l'accesso al mio fornitore di regole per vedere se esiste).
Si tratta di una svista nell'API? O sto facendo qualcosa di sbagliato?
*) A dire il vero, sto usando Java 7 e ThreeTen Backport, ma non credo che le questioni a questa domanda.
PS: mia soluzione attuale è quella di utilizzare 25 diversi DateTimeFormatter
s con letterale zona id (. Es "ddHHmm'A' MMM yy"
, "ddHHmm'B' MMM yy"
, ecc), utilizzare un RegExp
per estrarre la zona id, e delegando al formattatore corretto in base alla zona. Gli id di zona nel provider sono denominati "Alpha", "Bravo", ecc. Per consentire a ZoneId.of(...)
di trovare le zone. Funziona. Ma non è molto elegante, e spero che ci sia una soluzione migliore.
Hai provato 'V per la zona-id nella stringa di formato (vale a dire ' "ddHHmmV MMM yy"')? AFAIK "Z" significa solo carattere "Z". https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html –
Sì, ho capito che ''Z'' è un valore letterale e non viene interpretato dal parser. 'Z' (non quotato) è un simbolo (ma non funziona). E sì, ho provato 'V'. Tuttavia, dà un errore diverso ... 'IllegalArgumentException: Il conteggio delle lettere del modello deve essere 2: V' quando si tenta di creare il formattatore. Usando 'VV', torno all'eccezione" ... non può essere analizzata all'indice 6 "durante l'analisi. Grazie comunque! :-) – haraldK
@PavelHoral In realtà, sembra che il simbolo "corretto" sia 'z' (in minuscolo) ... Sembra che analizzi correttamente la zona, ma ovviamente esplode perché la zona a singola lettera non è consentita ..: -P "' ... non è stato possibile analizzare: zona non valida: A' ". Aggiornerò la domanda ... – haraldK