¿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.


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));

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

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")

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í .


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. :)


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();

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();
}

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.