Conversione di una stringa di data in un oggetto DateTime utilizzando la libreria Joda Time


246

Ho una data come stringa nel seguente formato "04/02/2011 20:27:05". Sto usando la libreria Joda-Time e vorrei convertirla in DateTimeoggetto. L'ho fatto:

DateTime dt = new DateTime("04/02/2011 20:27:05")

Ma sto ricevendo il seguente errore:

Invalid format: "04/02/2011 14:42:17" is malformed at "/02/2011 14:42:17"

Come convertire la data sopra in un DateTimeoggetto?


2
Per chiunque arrivi qui alla ricerca di come analizzare le stringhe della data usando il java.timepacchetto in Java 8, prova a usare LocalDateTime.parseo Instant.parse.
Heenenee,

1
Cordiali saluti, il progetto Joda-Time è ora in modalità di manutenzione , con il team che consiglia la migrazione alle classi java.time . Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


477

Utilizzare DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);

2
Ciao, è possibile che il formatter non accetti i fusi orari? restituisce "ZZ" "MEZ", quando si applica la toStringfunzione, ma non posso analizzare da esso: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". È un problema noto? Come posso evitarlo? Saluti.
Danyel,

2
@Danyel: puoi aggiungere fusi orari come questo DateTimeFormat.forPattern ("yyyy-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque,

2
Ottengo un formato non valido: "2014-11-04T17: 41: 52.000 + 01: 00" non è valido in "+01: 00" con il seguente formattatore: data statica finale privata DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("yyyy-MM- dd'T'HH: mm: ss.SSS'ZZ ' "); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3])) su joda-time 2.2
Stephane

2
Dopo aver rimosso le virgolette singole attorno alla ZZ ha funzionato. Mi chiedo cosa significano queste citazioni singole ...
Stephane

2
@StephaneEybert (o chiunque altro) Le virgolette singole indicano che qualcosa è un carattere letterale prevedibile nella stringa e non deve essere considerato parte del modello. Ad esempio: se la data viene visualizzata come "2015-08-dd30" per qualche motivo, è necessario specificare "yyyy-MM-'dd'dd", indicando che il primo giorno è una parte letterale prevista nella stringa e il secondo giorno (al di fuori degli apostrofi) è il giorno effettivo che deve essere analizzato. Quindi nel tuo caso precedente avrebbe funzionato se al posto del fuso orario effettivo avessi messo "ZZ" alla fine della stringa di data e ora in arrivo.
SadBunny,

62

So che questa è una vecchia domanda, ma volevo aggiungere che, a partire da JodaTime 2.0, puoi farlo con una sola riga:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));

3
Cosa devo mettere nella sezione di importazione?
Dmitry,

20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

7
Dovrebbe essere: DateTimeFormat.forPattern ("gg / MM / aaaa HH: mm: ss"). ParseDateTime ("04/02/2011 20:27:05")
sufinawaz

16

Dai commenti ho scelto una risposta come e aggiungendo anche TimeZone:

String dateTime = "2015-07-18T13:32:56.971-0400";

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        .withLocale(Locale.ROOT)
        .withChronology(ISOChronology.getInstanceUTC());

DateTime dt = formatter.parseDateTime(dateTime);

13

Il tuo formato non è il formato ISO previsto, dovresti provare

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");

5

Puoi anche usare SimpleDateFormat , come inDateTimeFormat

Date startDate = null;
Date endDate = null;
try {
    if (validDateStart!= null) startDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateStart + " " + validDateStartTime);
    if (validDateEnd!= null) endDate = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH).parse(validDateEnd + " " + validDateEndTime);
} catch (ParseException e) {
    e.printStackTrace();
}

3
kirlisakal non in questo caso, ma non creare un'istanza condivisa di un SimpleDateFormat in quanto non è thread-safe, è un incubo eseguire il debug se lo fai
dannrob

2
Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle . E le classi java.time sono thread-safe, a differenza delle classi legacy.
Basil Bourque,

3

È necessario un DateTimeFormatter appropriato al formato che si sta utilizzando. Dai un'occhiata ai documenti per istruzioni su come costruirne uno.

Al di fuori del bracciale, penso che tu abbia bisogno format = DateTimeFormat.forPattern("M/d/y H:m:s")


3

tl; dr

java.time.LocalDateTime.parse( 
    "04/02/2011 20:27:05" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" )
)

java.time

L'approccio moderno utilizza le classi java.time che soppiantano il venerabile progetto Joda-Time .

Analizza come un LocalDateTimeinput privo di qualsiasi indicatore di fuso orario o offset da UTC.

String input = "04/02/2011 20:27:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02-04T20: 27: 05

Suggerimento: ove possibile, utilizzare i formati ISO 8601 standard quando si scambiano valori data-ora come testo anziché come formato visualizzato qui. Convenientemente, le classi java.time usano i formati standard quando analizzano / generano stringhe.


Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, e SimpleDateFormat.

Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


2

Un metodo semplice:

public static DateTime transfStringToDateTime(String dateParam, Session session) throws NotesException {
    DateTime dateRetour;
    dateRetour = session.createDateTime(dateParam);                 

    return dateRetour;
}

0

Ci sono due modi per raggiungere questo obiettivo .

DateTimeFormat

DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");

SimpleDateFormat

        String dateValue = "04/02/2011 20:27:05";
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); //  04/02/2011 20:27:05

        Date date = sdf.parse(dateValue); // returns date object
        System.out.println(date); // outputs: Fri Feb 04 20:27:05 IST 2011

Entrambi obsoleti. C'è anche un modo moderno; è nella risposta di Basil Bourque . Inoltre non stai contribuendo con nulla che non sia già presente in molte altre risposte. E quando viene chiesto a Joda-Time, suggerire che il più lungo obsoleto e notoriamente problematico SimpleDateFormatè male secondo la mia opinione più onesta.
Ole VV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.