2010-04-27 27 views
41

come specificare la stringa di formato per convertire la data solo dalla corda. Nel mio caso, solo la parte data è rilevanteTempo joda: come convertire String in LocalDate?

Costruire come DateTime fallisce:

String dateString = "2009-04-17"; 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); 
DateTime dateTime = formatter.parseDateTime(dateString); 

con errore java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short

Probabilmente perché dovrei usare LocalDate invece. Ma, non vedo alcun formattatore per LocalDate. Qual è il modo migliore per convertire String dateString = "2009-04-17"; in LocalDate (o qualcos'altro se questo non è la rappresentazione a destra)

grazie ...

risposta

51

Probabilmente siete alla ricerca di LocalDate(Object). E 'un po' di confusione in quanto ci vuole un generico Object, ma la documentazione indicano che utilizzerà un ConverterManager che sa come gestire un String se si passa un String al costruttore, per esempio

LocalDate myDate = new LocalDate("2010-04-28"); 
+7

È sicuramente una voce Javadoc potenzialmente confusa. – SteveD

+0

grazie mille per il puntatore ... Sono un po 'confuso su come usare ConverterManager. Come posso passare la stringa ad esso? Ho bisogno di aggiungere un convertitore parziale ad esso? ma per impostazione predefinita accetta la stringa per la conversione parziale. Se potessi fare un esempio, sarebbe di grande aiuto .. grazie – bsr

+1

Scusa la mia risposta non è stata abbastanza chiara, ma sembra che tu l'abbia capito. In effetti intendevo veramente: 'LocalDate myDate finale = new LocalDate (" 2010-04-28 ");' –

17

Utilizzare il metodo parse(String).

LocalDate date = LocalDate.parse("2009-04-17"); 
1

questo ha funzionato per me:

LocalDate d1 = LocalDate.parse("2014-07-19"); 
LocalDate dNow = LocalDate.now(); // Current date 
+2

Qual è il punto di questa risposta? La risposta accettata è migliore, con un codice più semplice, e fornisce anche una spiegazione. –

1

È possibile utilizzare LocalDate.of con l'anno, mese e giorno passato come argomenti separati:

LocalDate date1 = LocalDate.of(2009, 4, 17); 
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17); 
7

C'è un problema di bug-ish un po 'sottile con l'utilizzo di LocalDate.parse() o new LocalDate(). Uno snippet di codice vale più di mille parole. Nel seguente esempio nello scala repl ho voluto ottenere una data locale in un formato stringa yyyyMMdd. LocalDate.parse() è felice di darmi un esempio di un LocalDate, ma non è quello corretto (new LocalDate() ha lo stesso comportamento):

scala> org.joda.time.LocalDate.parse("20120202") 
res3: org.joda.time.LocalDate = 20120202-01-01 

dò Feb 2, 2016 nel formato aaaaMMgg e torno una data del 1 ° gennaio 20120202. Sto uscendo su un ramo qui: non penso che questo sia quello che dovrebbe fare. Joda usa 'yyyy-MM-dd' come predefinito, ma implicitamente accetta una stringa senza '-' caratteri, pensando che si desidera 1 gennaio di quell'anno? Questo non mi sembra un comportamento di default ragionevole.

Detto questo, mi sembra che l'uso di un formattatore di data joda che non può essere così facilmente ingannare è una soluzione migliore per il parsing di una stringa. Inoltre, LocalDate.parse() dovrebbe probabilmente gettare un'eccezione se il formato della data non e 'yyyy-MM-dd':

scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd") 
format: org.joda.time.format.DateTimeFormatter = [email protected] 

scala> org.joda.time.LocalDate.parse("20120202", format) 
res4: org.joda.time.LocalDate = 2012-02-02 

questo farà sì che altri formati di fallire in modo che non si ottiene questo comportamento buggy strano:

scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd") 
format: org.joda.time.format.DateTimeFormatter = [email protected] 

scala> org.joda.time.LocalDate.parse("20120202", format) 
java.lang.IllegalArgumentException: Invalid format: "20120202" is too short 
    at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) 
    at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844) 
    at org.joda.time.LocalDate.parse(LocalDate.java:179) 
    ... 65 elided 

, che è un comportamento molto più sano di essere una data nel corso dell'anno 20120202.

+0

Questa dovrebbe essere una risposta accettata. –

+0

Joda chiaramente statis in javadocs: 'Accetta formati descritti dalla seguente sintassi: date-element = std-date-element | ord-date-element | elemento data-settimana std-date-element = yyyy ['-' MM ['-' dd]] ord-date-element = yyyy ['-' DDD] settimana-data-elemento = xxxx '-W 'ww [' - 'e] '. Penso che questo sia un comportamento abbastanza sano. – Czar

+0

affermare nei documenti è una cosa, dare una grande fossa 'o l'incapacità di cadere in è un altro, mi sembra –

4

nel mio caso, stringa in entrata possono essere in uno dei due formati.Quindi prima provo ad analizzare la stringa con un formato più specifico:

String s = "2016-02-12"; 
LocalDateTime ldt; 
try { 
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm")); 
} 
catch (IllegalArgumentException e) { 
    ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd")); 
} 
Problemi correlati