Como formatar Joda-Time DateTime para apenas mm / dd / aaaa?

189

Eu tenho uma string " 11/15/2013 08:00:00", quero formatá-la para " 11/15/2013", qual é o DateTimeFormatterpadrão correto ?

Eu tentei muitos e pesquisei no Google e ainda não consegui encontrar o padrão correto.

edit: Estou procurando Joda-Time DateTimeFormatter , não SimpleDateFormat de Java.

iCodeLikeImDrunk
fonte
2
tl; dr: DateTimeFormat.forPattern ("MM / dd / aaaa HH: mm: ss"). print (DateTime.now ())
Andrew

Respostas:

385

Hora Joda

Crie um DateTimeFormatterusandoDateTimeFormat.forPattern(String)

Usando o tempo Joda, você faria assim:

String dateTime = "11/15/2013 08:00:00";
// Format for input
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy");
// Printing the date
System.out.println(dtfOut.print(jodatime));

Java padrão ≥ 8

O Java 8 introduziu uma nova biblioteca de Data e Hora , facilitando o tratamento de datas e horas. Se você deseja usar o Java versão 8 ou posterior, use um DateTimeFormatter . Como você não possui um fuso horário no seu String, um java.time.LocalDateTime ou um LocalDate , caso contrário, as variedades de fuso horário ZonedDateTime e ZonedDate podem ser usadas.

// Format for input
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
LocalDate date = LocalDate.parse(dateTime, inputFormat);
// Format for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// Printing the date
System.out.println(date.format(outputFormat));

Java padrão <8

Antes do Java 8, você usava a SimpleDateFormat e java.util.Date

String dateTime = "11/15/2013 08:00:00";
// Format for input
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
// Parsing the date
Date date7 = dateParser.parse(dateTime);
// Format for output
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
// Printing the date
System.out.println(dateFormatter.format(date7));
DeltaLima
fonte
7
Desculpe, mas estou procurando o DateTimeFormatter de jodatime.
iCodeLikeImDrunk
1
@yaojiang Joda usa a mesma sintaxe de string de formato que SimpleDateFormat. Leia a documentação da API.
Jesper
@yaojiang Como Jesper mencionou, o Joda usa as mesmas seqüências de formatação, embora tenha mais opções. Estendi o exemplo para incluir o Joda, como você pode ver, é muito semelhante.
DeltaLima
estranhamente, estou usando DateTimeFormatter dtf = DateTimeFormat.forPattern ("MM / dd / aaaa"); e eu ainda obter "mm hh / DD / AAAA: mm: ss" ...
iCodeLikeImDrunk
2
Enquanto o Joda-Time usa códigos de formatação muito semelhantes aos java.util.Date/Calendar, leia o documento com atenção para diferenças sutis. Eles não são idênticos.
Basil Bourque
45

Estou adicionando isso aqui, mesmo que as outras respostas sejam completamente aceitáveis. O JodaTime possui analisadores pré-construídos no DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

Esta é a maioria das opções impressas com seu formato:

shortDate:         11/3/16
shortDateTime:     11/3/16 4:25 AM
mediumDate:        Nov 3, 2016
mediumDateTime:    Nov 3, 2016 4:25:35 AM
longDate:          November 3, 2016
longDateTime:      November 3, 2016 4:25:35 AM MDT
fullDate:          Thursday, November 3, 2016
fullDateTime:      Thursday, November 3, 2016 4:25:35 AM Mountain Daylight Time
Chad Bingham
fonte
1
legal, alguma ideia de qual versão foi introduzida? economizar muito tempo por não criar seqüências de formato estúpidas ...
iCodeLikeImDrunk
Sim, eu concordo totalmente. Parece que sempre esteve lá. joda-time.sourceforge.net/apidocs/org/joda/time/format/...
Chad Bingham
21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")
sebastian krüger
fonte
1
Isso é útil, embora não responda exatamente à pergunta. Versão de uma linha:DateTime.now().toString("HH:mm:ss")
hBrent 26/01
11

Eu acho que isso vai funcionar, se você estiver usando o JodaTime:

String strDateTime = "11/15/2013 08:00:00";
DateTime dateTime = DateTime.parse(strDateTime);
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/YYYY");
String strDateOnly = fmt.print(dateTime);

Eu tenho parte disso daqui .

O cara com o chapéu
fonte
Seu link para a documentação está desatualizado. O URL correto é: joda.org/joda-time/apidocs/org/joda/time/format/…
Basil Bourque
1
@BasilBourque Obrigado por apontar que Dé para o dia do ano, mas meu "link para documentação" não está desatualizado: a documentação à qual vinculei está desatualizada. Eu não estava vinculando à documentação por si só, estava vinculando à página da qual obtive algum código - que por acaso é uma documentação desatualizada.
O cara com o chapéu
10

Eu tenho uma opção muito burra, mas funcional. se você tiver a string fullDate = "15/11/2013 08:00:00";

   String finalDate = fullDate.split(" ")[0];

Isso deve funcionar fácil e rápido. :)

Clad Clad
fonte
Sim, definitivamente mudarei o formato. isso funciona, mas apenas para este caso.
ICodeLikeImDrunk
1
Comportamento não é realmente o esperado, depois ninguém (inclusive você) que olha seu código nada o que você fez aqui entendo ...
Sercan Ozdemir
3

ATUALIZADA:

Você pode: criar uma constante:

private static final DateTimeFormatter DATE_FORMATTER_YYYY_MM_DD =
          DateTimeFormat.forPattern("yyyy-MM-dd"); // or whatever pattern that you need.

Este DateTimeFormat está importando de: (tenha cuidado com isso)

import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter;

Analise a data com:

DateTime.parse(dateTimeScheduled.toString(), DATE_FORMATTER_YYYY_MM_DD);

Antes:
DateTime.parse ("201711201515", DateTimeFormat.forPattern ("aaaaMMddHHmm")). ToString ("aaaaMMdd");

se quiser data e hora:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();
Jacky.cheng
fonte
2

Isso funciona

String x = "22/06/2012";
String y = "25/10/2014";

String datestart = x;
String datestop = y;

//DateTimeFormatter format = DateTimeFormat.forPattern("dd/mm/yyyy");
SimpleDateFormat  format = new SimpleDateFormat("dd/mm/yyyy");

Date d1 = null;
Date d2 = null;

try {
    d1 =  format.parse(datestart);
    d2 = format.parse(datestop);

    DateTime dt1 = new DateTime(d1);
    DateTime dt2 = new DateTime(d2);

    //Period
    period = new Period (dt1,dt2);

    //calculate days
    int days = Days.daysBetween(dt1, dt2).getDays();


} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Eddie
fonte
1

Outra maneira de fazer isso é:

String date = dateAndTime.substring(0, dateAndTime.indexOf(" "));

Não estou exatamente certo, mas acho que isso pode ser mais rápido / use menos memória do que usar o .split()método

O cara com o chapéu
fonte