Convertir una cadena de fecha a un objeto DateTime usando la biblioteca Joda Time

246

Tengo una fecha como una cadena en el siguiente formato "04/02/2011 20:27:05". Estoy usando la biblioteca Joda-Time y me gustaría convertirla en DateTimeobjeto. Yo hice:

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

Pero obtengo el siguiente error:

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

¿Cómo convertir la fecha anterior en un DateTimeobjeto?

Tom
fuente
2
Para cualquiera que llegue aquí y busque cómo analizar cadenas de fechas usando el java.timepaquete en Java 8, intente usar LocalDateTime.parseo Instant.parse.
heenenee
1
Para su información, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time . Ver Tutorial de Oracle .
Basil Bourque

Respuestas:

477

Uso DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);
Bozho
fuente
2
Hola, ¿es posible que el formateador no acepte zonas horarias? devuelve "ZZ" "MEZ", cuando se aplica la toStringfunción, pero no puedo analizar de ella: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". ¿Es este un problema conocido? ¿Cómo puedo evitarlo? Saludos.
Danyel
2
@Danyel: puede agregar zonas horarias como esta DateTimeFormat.forPattern ("aaaa-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque
2
Obtengo un formato no válido: "2014-11-04T17: 41: 52.000 + 01: 00" está mal formado en "+01: 00" con el siguiente formateador: privado estático final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern ("aaaa-MM- dd'T'HH: mm: ss.SSS'ZZ '"); DATE_TIME_FORMATTER.parseDateTime ((String) customSoftware.get (header [3])) en joda-time 2.2
Stephane
2
Después de eliminar las comillas simples alrededor de la ZZ funcionó. Me pregunto qué significan estas citas simples ...
Stephane
2
@StephaneEybert (o cualquier otra persona) Las comillas simples significan que algo es un carácter literal que se espera en la cadena y no debe considerarse parte del patrón. Por ejemplo: si su fecha aparece como "2015-08-dd30" por alguna razón, debe especificar "aaaa-MM-'dd'dd", lo que indica que el primer dd es una parte literal esperada en la cadena, y El segundo dd (fuera de los apóstrofes) es el día real que debe analizarse. Entonces, en su caso anterior, habría funcionado si en lugar de la zona horaria real hubiera puesto "ZZ" al final de su cadena de fecha y hora entrante.
SadBunny
62

Sé que esta es una pregunta antigua, pero quería agregar que, a partir de JodaTime 2.0, puede hacer esto con una sola línea:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
stephen.hanson
fuente
3
¿Qué debo poner en la sección de importación?
Dmitry
20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
Shawn Vader
fuente
77
Debe ser: DateTimeFormat.forPattern ("dd / MM / aaaa HH: mm: ss"). ParseDateTime ("02/02/2011 20:27:05")
sufinawaz
16

De los comentarios elegí una respuesta como y también agregué 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);
Ali Karaca
fuente
13

Su formato no es el formato ISO esperado, debe intentar

DateTimeFormatter format = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime time = format.parseDateTime("04/02/2011 20:27:05");
Karl-Bjørnar Øie
fuente
5

También puede usar SimpleDateFormat , como enDateTimeFormat

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();
}
efirat
fuente
3
kirlisakal no lo hace en este caso, pero no cree una instancia compartida de SimpleDateFormat ya que no es seguro para subprocesos, es una pesadilla depurar si lo hace
dannrob
2
Para su información, las viejas clases problemáticas de fecha y hora como java.util.Date, java.util.Calendary java.text.SimpleDateFormatahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y Java 9. Consulte el Tutorial de Oracle . Y las clases java.time son seguras para subprocesos, a diferencia de las clases heredadas.
Basil Bourque
3

Necesita un DateTimeFormatter apropiado para el formato que está utilizando. Eche un vistazo a los documentos para obtener instrucciones sobre cómo construir uno.

Fuera del puño, creo que necesitas format = DateTimeFormat.forPattern("M/d/y H:m:s")

Mark Tozzi
fuente
3

tl; dr

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

java.time

El enfoque moderno utiliza las clases java.time que suplantan al venerable Joda-Time proyecto .

Analice como LocalDateTimesu entrada carece de cualquier indicador de zona horaria o desplazamiento desde 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

Consejo: Cuando sea posible, use los formatos estándar ISO 8601 al intercambiar valores de fecha y hora como texto en lugar del formato que se ve aquí. Convenientemente, las clases java.time usan los formatos estándar al analizar / generar cadenas.


Sobre java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date, Calendar, y SimpleDateFormat.

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente
2

Un metodo simple:

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

    return dateRetour;
}
sissi49
fuente
0

Hay dos formas en que esto podría lograrse .

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
Dulith De Costa
fuente
Ambos están desactualizados. También hay una manera moderna; está en la respuesta de Basil Bourque . Además, no está aportando nada que no esté en otras respuestas. Y cuando se pide Joda-Time, en mi opinión más honesta , sugerir que es aún más desactualizado y notoriamente problemático SimpleDateFormates malo .
Ole VV