Come creeresti a livello di codice un modello da una data archiviata in una stringa?

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una stringa che contiene la rappresentazione di una data.Sembra:

Giovedì 30 novembre 19:00:00 EST 2006

Sto cercando di creare un oggetto Date utilizzando SimpleDateFormat e riscontro 2 problemi.

1.) Non riesco a capire il modello per codificare la soluzione nel costruttore SimpleDateFormat

2.) Non riesco a trovare un modo per analizzare la stringa utilizzando l'API per determinare il modello in modo da poterlo riutilizzare per diversi modelli di output della data

Se qualcuno conosce una soluzione che utilizza l'API o una soluzione personalizzata, lo apprezzerei molto.

È stato utile?

Soluzione

È possibile verificare il formato da passare a SimpleDateFormat http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

Per quanto riguarda la tua seconda domanda, non conosco alcuna libreria Java per capire un formato di data e analizzarlo senza sapere in anticipo quale sia il formato.

Altri suggerimenti

Il parser di date POJava org.pojava.datetime.DateTime è un parser immutabile e robusto che supporta più lingue, fusi orari e formati.

Meglio ancora, il parser è euristico e non richiede un “formato” preesistente per funzionare.Basta passargli una stringa di testo data/data-ora e ottenere un java.util.Date!

Non sono sicuro che esista un modo semplice per analizzare una data e elaborarne lo schema, ma avrei pensato che lo schema per quello che hai pubblicato sarebbe stato:

EEE MMM gg HH:mm:ss zzz aaaa

Se vuoi fare qualcosa di diverso dall'analizzare o formattare una data, non c'è molto là fuori per gestire i modelli stessi.Qualche tempo fa stavo scrivendo un componente Swing per inserire date in un campo di testo formattato.Hai fornito un modello e questo ha spostato il cursore per l'immissione del testo attraverso gli elementi di quel modello, consentendo solo valori validi.

Come parte di ciò ho scritto un DateFormatParser disponibile qui come parte del progetto open source OpenHarmonise.

Analizzare una data in uno schema sarebbe un problema estremamente interessante da affrontare.Dovresti fare alcune ipotesi (ad es.uso di:in tempo e non in data) ma dovresti affrontare gli eterni problemi degli anni a 2 cifre e delle disposizioni giorno/mese o mese/giorno.

Vale la pena sapere che il formato della data che hai fornito non è arbitrario.È l'output del metodo Date.toString() integrato (almeno nelle versioni locali del Regno Unito e degli Stati Uniti).Non a caso, è anche il formato del comando unix 'date' (almeno su Linux, e credo anche in altre implementazioni) - anche se per essere pedante, Date.toString() inserisce uno zero nei numeri dei giorni a una cifra mentre la data unix no.

Ciò significa che è probabile che tu riceva questo formato di input quando inserisci una data non formattata in un campo modificabile dall'utente (ad es.un campo INPUT HTML) e riceverlo indietro senza modifiche.Quindi, solo perché l'input arriva in questo formato, non significa che gli utenti digiteranno mille altri formati arbitrari.

Certo, potrebbero ancora.Il modo in cui gestisco gli input di data in generale è con una serie di blocchi try/catch, in cui lo provo con un formato, poi con un altro, poi con un altro.La nostra struttura standard ora prevede fino a circa 20 formati diversi per impostazione predefinita.Naturalmente non è ancora perfetto;L'altro giorno ho trovato qualcuno che immetteva "03 settembre" come data (un'abbreviazione di mese non standard e senza anno) e non avevamo gestito quello scenario.

Vedi Apache Commons' DateUtils.C'è un parseDate metodo che prende il tuo String e più modelli da provare e sputare a Date esempio.

Come altri hanno già detto, il modello sembra che dovrebbe essere

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

Per quanto riguarda l'analisi di una data in formato arbitrario, non sono a conoscenza di alcuna libreria che lo faccia in Java.Se volessi sviluppare una cosa del genere, inizierei guardando il perl str2time funzione.

Devo dire che trovo l'altra domanda molto interessante.C'è però un problema serio: analizza questo:07/08/06!Se ti limiti a un sottoinsieme di formati previsti, potresti probabilmente risolvere il problema giocando con le espressioni regolari, potresti creare un sacco di modelli attesi, quindi spezzare le stringhe su spazi o altro e abbinare parte per parte.

Stai solo chiedendo il modello per quella determinata data?Se è così, penso che questo dovrebbe farlo:

"EEE MMM d HH:mm:ss z yyyy"

Oppure stai cercando di prendere una data formattata, dedurre il formato e analizzarlo?

Che ne dite di:

EEE MMM dd HH:mm:ss zzz yyyy

Basta passare la stringa nel costruttore di SimpleDateFormat.Per utilizzare l'oggetto, chiama semplicemente il metodo parse passando la stringa che desideri convertire in una data.

Potresti dare un'occhiata a:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Non è proprio la stessa cosa, ma potresti voler guardare qualcosa di simile JCronico, che può eseguire l'elaborazione del linguaggio naturale nelle date.Pertanto, la data di input potrebbe essere qualcosa come "domani" o "due settimane dal prossimo martedì".

Questo potrebbe non essere affatto d'aiuto per la tua applicazione, ma potrebbe esserlo.

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