Domanda

C'è un modo per forzare il tempo di Joda ad analizzare le date solo quando contengono anni a quattro cifre? Ad esempio:

  • 11/11/2009 - dovrebbe essere analizzato
  • 09-11-11 - non deve analizzare

Ho provato il seguente codice:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

Analizza 0009-11-11. Apparentemente minDigit nel metodo appendYear sono usati solo per la formattazione quando si stampa la data.
Il risultato è lo stesso se uso appendYearOfEra (). Se uso appendYearOfCentury (), analizza invece l'anno 1909.

Stiamo implementando un parser di dati generali, che riconoscerà vari tipi di input. Anche l'esempio è una forma abbreviata del vero affare (per semplicità). Gli scenari di vita reale analizzano le date che possono avere giorni della settimana, mesi come parole, ora, zona e caratteri diversi che separano mese, giorno e anno. Pertanto, scrivere un RegEx o controllare il contenuto / la lunghezza della stringa può rivelarsi piuttosto difficile.

Alcuni esempi reali potrebbero apparire così:

  • 2009-11-11
  • Mercoledì 2009-11-11T15: 00: 00
  • 2009/11/11 15:00
  • e molti altri ...
È stato utile?

Soluzione

DateTimeFormatterBuilder.appendFixedDecimal () potrebbe fare quello che ti serve.

In alternativa, è possibile implementare l'interfaccia DateTimeParser per creare qualsiasi parser desiderato e passarlo a DateTimeFormatterBuilder.

Altri suggerimenti

Puoi controllare la lunghezza della stringa della data.

Puoi creare parser e formattatori estremamente specifici usando DateTimeFormatterBuilder . In genere non è necessario utilizzare questa classe direttamente, poiché i formati più comuni sono più facilmente disponibili altrove nell'API, ma questa è la classe builder che tutti usano sotto le copertine.

Cosa vuoi ottenere da un utente che inserisce "0001-01-01" come data (ovvero, ha immesso 4 cifre per l'anno, ma i primi tre erano zero)? Che dire di '0999-12-31'? E '999-12-31'? E che dire di "10000-01-01": il famigerato Y10K 1 problema?

  • Se questo è un valore legittimo, allora sei bloccato nel scoprire la lunghezza di ciò che l'utente ha digitato come la parte dell'anno della data (probabilmente dopo che è stata eseguita qualsiasi altra analisi) e assicurarti che sia a almeno (o è esattamente?) quattro cifre.

  • Se questo non è un valore legittimo, allora sei bloccato con il controllo del valore dell'anno dopo che la data è stata analizzata.

  • Oppure puoi prendere il codice e modificarlo in modo che includa la tua definizione preferita di anno valido.


1 Non ho intenzione di iniziare a lavorare per risolvere il problema Y10K prima del 5000-01-02.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top