¿Cómo formatear Joda-Time DateTime a solo mm / dd / aaaa?

189

Tengo una cadena " 11/15/2013 08:00:00", quiero formatearla en " 11/15/2013", ¿cuál es el DateTimeFormatterpatrón correcto ?

He probado muchos y busqué en Google y todavía no puedo encontrar el patrón correcto.

editar: Estoy buscando Joda-Time DateTimeFormatter , no SimpleDateFormat de Java.

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

Respuestas:

385

Tiempo de joda

Crear un DateTimeFormatterusoDateTimeFormat.forPattern(String)

Usando el tiempo de Joda lo harías así:

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 estándar ≥ 8

Java 8 introdujo una nueva biblioteca de fecha y hora , lo que facilita el manejo de fechas y horas. Si desea utilizar la versión 8 estándar de Java o posterior, usaría un DateTimeFormatter . Como no tiene una zona horaria en su String, java.time.LocalDateTime o LocalDate , de lo contrario, se podrían usar las variedades de zona horaria ZonedDateTime y ZonedDate .

// 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 estándar <8

Antes de Java 8, usaría un SimpleDateFormat y 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
fuente
77
lo siento, pero estoy buscando el DateTimeFormatter de jodatime.
iCodeLikeImDrunk
1
@yaojiang Joda usa la misma sintaxis de cadena de formato que SimpleDateFormat. Lea la documentación de la API.
Jesper
@yaojiang Como Jesper mencionó, Joda usa las mismas cadenas de formato, aunque tiene más opciones. He extendido el ejemplo para incluir a Joda, como pueden ver es muy similar.
DeltaLima
extrañamente estoy usando DateTimeFormatter dtf = DateTimeFormat.forPattern ("MM / dd / aaaa"); y sigo recibiendo "mm / dd / aaaa hh: mm: ss" ...
iCodeLikeImDrunk
2
Si bien Joda-Time utiliza códigos de formato muy similares a java.util.Date/Calendar, lea el documento detenidamente para ver diferencias sutiles. No son idénticos
Basil Bourque
45

Estoy agregando esto aquí a pesar de que las otras respuestas son completamente aceptables. JodaTime tiene analizadores preconstruidos en DateTimeFormat:

dateTime.toString(DateTimeFormat.longDate());

Esta es la mayoría de las opciones impresas con su 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
fuente
1
bueno, ¿alguna idea de qué versión se introdujo? ahorre mucho tiempo al no crear cadenas de formato estúpido ...
iCodeLikeImDrunk
Sí, estoy totalmente de acuerdo. Parece que siempre ha estado allí. joda-time.sourceforge.net/apidocs/org/joda/time/format/…
Chad Bingham el
21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")
sebastian krüger
fuente
1
Esto es útil, aunque no responde exactamente la pregunta. Versión de una línea:DateTime.now().toString("HH:mm:ss")
hBrent
11

Creo que esto funcionará si estás usando 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);

Tengo parte de esto de aquí .

El chico con el sombrero
fuente
Su enlace a la documentación está desactualizado. La URL correcta es: joda.org/joda-time/apidocs/org/joda/time/format/…
Basil Bourque
1
@BasilBourque Gracias por señalar que Des para el día del año, pero mi "enlace a la documentación" no está desactualizado: la documentación a la que me vinculé no está actualizada. No me estaba vinculando a la documentación por sí misma, me estaba vinculando a la página de la que obtuve un código, que resulta ser documentación obsoleta.
The Guy with The Hat
10

Tengo una opción muy tonta pero que funciona. si tiene la Cadena fullDate = "15/11/2013 08:00:00";

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

Eso debería funcionar fácil y rápido. :)

Clad Clad
fuente
Sí, definitivamente voy a cambiar el formato. esto funciona pero solo para este caso.
iCodeLikeImDrunk
1
Realmente comportamiento no esperado, luego nadie (incluido usted) que mira su código no entiende nada de lo que hizo aquí ...
Sercan Ozdemir
3

ACTUALIZADO:

Puedes: crear una constante:

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

Este DateTimeFormat se está importando desde: (tenga cuidado con eso)

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

Analiza la fecha con:

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

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

si quieres datetime:

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

Esto 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
fuente
1

Otra forma de hacerlo es:

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

No estoy exactamente seguro, pero creo que esto podría ser más rápido / usar menos memoria que usar el .split()método.

El chico con el sombrero
fuente