Ho un semplice problema: Voglio analizzare le stringhe Java nel formato "yyyyMMdd"
rigorosamente, in modo che "19800229"
sia una data valida, ma non lo è "19820229"
. Si supponga che queste siano date AD del normale calendario gregoriano.Utilizzo del nuovo DateTimeFormatter Java 8 per eseguire un'analisi rigorosa della data
Sto cercando di utilizzare il nuovo pacchetto java.time
da JDK 8 per risolvere questo problema, ma si sta dimostrando più complicato di quanto sperato. Il mio codice attuale è:
private static final DateTimeFormatter FORMAT = DateTimeFormatter
.ofPattern("yyyyMMdd").withChronology(IsoChronology.INSTANCE)
.withResolverStyle(STRICT);
public static LocalDate parse(String yyyyMMdd) {
return LocalDate.parse(yyyyMMdd, FORMAT);
}
Tuttavia, l'analisi di una data valida, ad esempio "19.800.228" produce ciò che per me è un errore incomprensibile:
java.time.format.DateTimeParseException: Text '19820228' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {MonthOfYear=2, DayOfMonth=28, YearOfEra=1982},ISO of type java.time.format.Parsed
Come faccio ad usare java.time.format.DateTimeFormatter
per risolvere il mio semplice caso d'uso ?
Grazie @Tech Trip. Scusate volevo dire 2/29 in entrambi i casi, come hai sottolineato. Il motivo per cui evito 'DateTimeFormatter.BASIC_ISO_DATE' è che ha una parte facoltativa che non voglio essere analizzabile. Posso creare un formattatore equivalente senza la parte opzionale? – 0xbe5077ed
Ho modificato la risposta per tenere conto del tuo ultimo commento. Si prega di dare un'occhiata! – TechTrip
Abbastanza buono, @Tech Trip. È quello che ho scoperto anche io. Nota che puoi rimuovere "parseCaseInsensitive()" - non necessario perché yyyyMMdd non ha problemi di maiuscole e 'startOptional()' perché non stai iniziando nulla di opzionale. – 0xbe5077ed