Fecha del calendario al formato aaaa-MM-dd en java


210

Cómo convertir la fecha del calendario al yyyy-MM-ddformato.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);            
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Esto producirá inActiveDate = Wed Sep 26 00:00:00 IST 2012. Pero lo que necesito es 2012-09-26. Mi propósito es comparar esta fecha con otra fecha en mi base de datos usando los criterios de Hibernate. Entonces necesito el objeto de fecha en yyyy-MM-ddformato.


55
Tu código es confuso. ¿Estás tratando de dar formato a un Datea yyyy-MM-ddo analizar una cadena de yyyy-MM-ddun Datevalor ?? Para formatear la fecha, simplemente use format1.format(date), para analizarla, useformat1.parse(someStringValueInTheCorrectFormat)
MadProgrammer

He editado mi pregunta ... Perdón por el error anterior ...
Sarika.S

9
One liner:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

Respuestas:


342

Un Java Datees un contenedor para la cantidad de milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT.

Cuando usa algo como System.out.println(date), Java usa Date.toString()para imprimir el contenido.

La única forma de cambiarlo es anular Datey proporcionar su propia implementación de Date.toString(). Ahora, antes de encender su IDE e intentar esto, no lo haría; solo complicará las cosas. Es mejor formatear la fecha al formato que desea usar (o mostrar).

Java 8+

LocalDateTime ldt = LocalDateTime.now().plusDays(1);
DateTimeFormatter formmat1 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(ldt);
// Output "2018-05-12T17:21:53.658"

String formatter = formmat1.format(ldt);
System.out.println(formatter);
// 2018-05-12

Antes de Java 8

Deberías estar haciendo uso del puerto de entrada ThreeTen

Lo siguiente se mantiene con fines históricos (como la respuesta original)

Lo que puedes hacer es formatear la fecha.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(cal.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

String formatted = format1.format(cal.getTime());
System.out.println(formatted);
// Output "2012-09-26"

System.out.println(format1.parse(formatted));
// Output "Wed Sep 26 00:00:00 EST 2012"

Estos son en realidad la misma fecha, representados de manera diferente.


1
Algo así, pero es mucho más fácil conCalendar
MadProgrammer

1
¿De todos modos eliminar completamente la zona horaria de este objeto de calendario?
Sarika.S

2
Si usted es realmente serio acerca de la fecha / manipulación del tiempo, echar un vistazo a Joda Time , es significativamente más fácil que jugar un poco conCalendar
MadProgrammer

2
@ n13 si la pregunta era sobre la manipulación de la fecha de la base de datos o incluso la manipulación del tiempo, podría estar de acuerdo con usted. La pregunta era cómo representar un valor de fecha en un formato de fecha particular
MadProgrammer

1
Respuesta bien estructurada: esta es básicamente la separación Modelo (Fecha) -Ver (Formato).
YoYo

19

Tu código está mal No hay punto de análisis de fecha y manténgalo como objeto Fecha.

Puede formatear el objeto de fecha del calendario cuando desee visualizarlo y mantenerlo como una cadena.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");          
String inActiveDate = null;
try {
    inActiveDate = format1.format(date);
    System.out.println(inActiveDate );
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

13

java.time

La respuesta de MadProgrammer es correcta, especialmente el consejo sobre Joda-Time . El sucesor de Joda-Time ahora está integrado en Java 8 como el nuevo paquete java.time . Aquí hay un código de ejemplo en Java 8.

Cuando se trabaja con fecha y hora (en oposición a la fecha local), la zona horaria es crítica. El día del mes depende de la zona horaria. Por ejemplo, la zona horaria de India es +05:30(cinco horas y media por delante de UTC), mientras que Francia está solo una hora por delante. Entonces, un momento en un nuevo día en India tiene una fecha, mientras que el mismo momento en Francia tiene la fecha de "ayer". Crear una salida de cadena que carece de información de zona horaria o desplazamiento es crear ambigüedad. Usted solicitó la salida AAAA-MM-DD, así que la proporcioné, pero no la recomiendo. En lugar de ISO_LOCAL_DATEhaber usado ISO_DATEpara obtener esta salida:2014-02-25+05:30

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( zoneId );

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE; // Caution: The "LOCAL" part means we are losing time zone information, creating ambiguity.
String output = formatterOutput.format( zonedDateTime );

Volcado a la consola ...

System.out.println( "zonedDateTime: " + zonedDateTime );
System.out.println( "output: " + output );

Cuando corres ...

zonedDateTime: 2014-02-25T14:22:20.919+05:30[Asia/Kolkata]
output: 2014-02-25

Joda-Time

Código similar usando la biblioteca Joda-Time , el precursor de java.time.

DateTimeZone zone = new DateTimeZone( "Asia/Kolkata" );
DateTime dateTime = DateTime.now( zone );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String output = formatter.print( dateTime );

ISO 8601

Por cierto, ese formato de su cadena de entrada es un formato estándar, uno de los varios formatos prácticos de cadena de fecha y hora definidos por ISO 8601 .

Tanto Joda-Time como java.time utilizan formatos ISO 8601 de forma predeterminada al analizar y generar representaciones de cadenas de varios valores de fecha y hora.


6

java.util.Dateel objeto no puede representar la fecha en formato personalizado , sino que debe usar el SimpleDateFormat.formatmétodo que devuelve string.

String myString=format1.format(date);

2

Para analizar un java.util.Dateobjeto, primero debe convertirlo a String con su propio formato.

inActiveDate = format1.parse(  format1.format(date)  );

Pero creo que estás siendo redundante aquí.


2
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date date = c.getTime();
SimpleDateFormat ft = new SimpleDateFormat("MM-dd-YYYY");
JOptionPane.showMessageDialog(null, ft.format(date));

Esto mostrará su fecha + 7 días en formato de mes, día y año en un panel de ventana JOption.


2
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, date);
    SimpleDateFormat format1 = new SimpleDateFormat("yyyy MM dd");
    String formatted = format1.format(cal.getTime());
    System.out.println(formatted);
}

2
Bienvenido a SO. Agregue algún contexto / explicación, ya que las respuestas de solo código no cumplen con nuestros estándares. Ver stackoverflow.com/help/how-to-answer
Uwe Allner el

0

Encontré este código donde se compara la fecha en un formato para comparar con el campo de fecha en la base de datos ... puede ser esto podría ser útil para usted ...

Cuando convierte la cadena a la fecha usando simpledateformat, es difícil de comparar con el campo Fecha en bases de datos mysql.

Por lo tanto, convierta la fecha de la cadena de Java en el formato usando select STR_to_DATE ('yourdate', '% m /% d /% Y') -> en este formato, entonces obtendrá el formato de fecha exacta del campo de fecha mysql.

http://javainfinite.com/java/java-convert-string-to-date-and-compare/


3
Se desaconsejan las respuestas de solo enlace en StackOverflow debido a la rotura de enlaces y otros problemas. ¿Puede dar un resumen de la información con puntos clave?
Basil Bourque

0
public static String ThisWeekStartDate(WebDriver driver) {
        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println("Before Start Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("Start Date " + CurrentDate);
          return CurrentDate;

    }
    public static String ThisWeekEndDate(WebDriver driver) {

        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println("Before End Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("End Date " + CurrentDate);
          return CurrentDate;
    }
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.