Convertendo uma string de data em um objeto DateTime usando a biblioteca Joda Time

246

Eu tenho uma data como uma string no seguinte formato "04/02/2011 20:27:05". Estou usando a biblioteca Joda-Time e gostaria de convertê-la em DateTimeobjeto. Eu fiz:

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

Mas estou recebendo o seguinte erro:

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

Como converter a data acima em um DateTimeobjeto?

Tom
fonte
2
Para quem chega aqui procurando como analisar Strings de data usando o java.timepacote no Java 8, tente usar LocalDateTime.parseou Instant.parse.
heenenee
1
Para sua informação, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

477

Use DateTimeFormat:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime dt = formatter.parseDateTime(string);
Bozho
fonte
2
Olá, é possível que o formatador não aceite fusos horários? "zz" retornos "MEZ", ao aplicar a toStringfunção, mas eu não posso analisar a partir dele: Invalid format: "31. Januar 2013 06:38:08 MEZ" is malformed at "MEZ". Isto é um problema conhecido? Como posso evitá-lo? Saudações.
Danyel 31/01
2
@Danyel: Você pode adicionar fusos horários como este DateTimeFormat.forPattern ("aaaa-MM-dd'T'HH: mm: ss.SSS'Z '") .withLocale (Locale.ROOT) .withChronology (ISOChronology.getInstanceUTC ()) ;
Hyque
2
Eu recebo um formato inválido: "2014-11-04T17: 41: 52.000 + 01: 00" está malformado em "+01: 00" com o seguinte formatador: private static 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])) no joda-time 2.2
Stephane
2
Depois de remover as aspas simples ao redor do ZZ, funcionou. Eu me pergunto o que essas aspas simples dizer ...
Stephane
2
@StephaneEybert (ou qualquer outra pessoa) As aspas simples significam que algo é um caractere literal esperado na string e não deve ser considerado parte do padrão. Por exemplo: se sua data aparecer como "2015-08-dd30" por algum motivo, você especificaria "aaaa-MM-'dd'dd", indicando que o primeiro dd é uma parte literal esperada na string e o o segundo dd (fora dos apóstrofes) é o dia real que precisa ser analisado. Portanto, no seu caso anterior, teria funcionado se, em vez do fuso horário real, você tivesse colocado "ZZ" no final da string de data / hora de entrada.
precisa saber é o seguinte
62

Sei que essa é uma pergunta antiga, mas eu gostaria de acrescentar que, a partir do JodaTime 2.0, você pode fazer isso com uma única linha:

DateTime date = DateTime.parse("04/02/2011 20:27:05", 
                  DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"));
stephen.hanson
fonte
3
O que devo colocar na seção de importação?
Dmitry
20
DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss").parseDateTime("04/02/2011 20:27:05");
Shawn Vader
fonte
7
Deve ser: DateTimeFormat.forPattern ("dd / MM / aaaa HH: mm: ss"). ParseDateTime ("04/04/2011 20:27:05")
sufinawaz
16

Dos comentários, escolhi uma resposta como e também adicionei o 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
fonte
13

Seu formato não é o formato ISO esperado, você deve tentar

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

Você também pode usar SimpleDateFormat , como emDateTimeFormat

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
fonte
3
kirlisakal não faz neste caso, mas não criar uma instância compartilhada de um SimpleDateFormat, pois não é thread-safe, é um pesadelo para depuração se você fizer
dannrob
2
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle . E as classes java.time são seguras para threads, ao contrário das classes herdadas.
Basil Bourque
3

Você precisa de um DateTimeFormatter apropriado ao formato que está usando. Dê uma olhada nos documentos para obter instruções sobre como criar um.

Fora do manguito, acho que você precisa format = DateTimeFormat.forPattern("M/d/y H:m:s")

Mark Tozzi
fonte
3

tl; dr

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

java.time

A abordagem moderna usa as classes java.time que substituem o venerável projeto Joda-Time .

Analise como a LocalDateTimecomo sua entrada não possui nenhum indicador de fuso horário ou deslocamento do 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

Dica: Sempre que possível, use os formatos ISO 8601 padrão ao trocar valores de data e hora como texto, em vez do formato visto aqui. Convenientemente, as classes java.time usam os formatos padrão ao analisar / gerar strings.


Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, e SimpleDateFormat.

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Onde obter as classes java.time?

O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
2

Um método simples:

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

    return dateRetour;
}
sissi49
fonte
0

duas maneiras isso pode ser alcançado .

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
fonte
Ambos desatualizados. Também existe uma maneira moderna; está na resposta de Basil Bourque . Além disso, você não está contribuindo com nada que ainda não esteja em várias outras respostas. E quando Joda-Time é solicitado, sugerir o mais desatualizado e notoriamente problemático SimpleDateFormaté ruim na minha opinião mais honesta.
26718 Ole VV