java date simpledateformat

java - Cambio de formato de fecha de cadena



date simpledateformat (4)

Está analizando la fecha 08/11/2008 00:00 con el formato yyyy/MM/dd HH:mm pero esta fecha no está en este formato.

mi formato de fecha actual es: 08/11/2008 00:00

Necesito convertir esta salida a 2008/11/08 00:00 Sin embargo, usando SimpleDateFormat como se investigó, no puede hacerlo y me da una salida totalmente diferente, aquí están mis códigos como sigue:

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") Date starting= simpleDateFormat2.parse(startTime); System.out.println("" + simpleDateFormat2.format(starting) + " real date " + startTime);

sé que estoy analizando en la cadena correcta dado que se produce la siguiente salida:

0014/05/01 00:00 real date 08/11/2008 00:00

No estoy muy seguro de cómo la mecánica detectó 0014/05/01 00:00 en lugar de

2008/11/08 00:00

Espero con interés todas las sugerencias Gracias de antemano


Esto se debe a que la cadena de fecha de origen que analizó tiene un formato diferente al de SimpleDateFormatter. Su fuente está en formato MM/dd/yyyy HH:mm . Cambie la cadena en SimpleDateFormat a MM/dd/yyyy HH:mm .

Intente usar otro formato después de su primer formato.

SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("MM/dd/yyyy HH:mm"); //You gotta parse it to a Date before correcting it Date parsedDate = simpleDateFormat2.parse(startTime); simpleDateFormat2 = new SimpleDateFormat("yyyy/MM/dd HH:mm") String newFormatttedDate = simpleDateFormat2.format(parsedDate);


Lo primero que debe hacer es analizar el valor original en un objeto Date

String startTime = "08/11/2008 00:00"; // This could be MM/dd/yyyy, you original value is ambiguous SimpleDateFormat input = new SimpleDateFormat("dd/MM/yyyy HH:mm"); Date dateValue = input.parse(startTime);

Una vez que haya hecho eso, puede formatear el valor de dateValue forma que desee ...

SimpleDateFormat output = new SimpleDateFormat("yyyy/MM/dd HH:mm"); System.out.println("" + output.format(dateValue) + " real date " + startTime);

que salidas:

2008/11/08 00:00 real date 08/11/2008 00:00

La razón por la que está obteniendo 0014/05/01 00:00 es SimpleDateFormat (cuando usa yyyy/MM/dd HH:mm ) está usando 08 para el año, 11 para el mes y 2008 para el día, está haciendo un balanceo interno de los valores para corregir los valores a una fecha válida


Me gustaría contribuir con la respuesta moderna.

DateTimeFormatter currentFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm"); DateTimeFormatter convertedOutputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm"); String startTime = "08/11/2008 00:00"; LocalDateTime starting = LocalDateTime.parse(startTime, currentFormatter); System.out.println(starting.format(convertedOutputFormatter));

Esto imprime

2008/11/08 00:00

La clase SimpleDateFormat que intentó usar está desactualizada y es notoriamente problemática. Has experimentado un poco del problema. En cambio, estoy usando y recomendando java.time , la API de fecha y hora moderna de Java.

Como han dicho otros, debe usar dos formateadores, uno para especificar su formato actual y otro para especificar el formato deseado.

¿Qué salió mal en tu código?

Su formateador con patrón de formato yyyy/MM/dd HH:mm interpretado el 11/08/2008 como el día 2008 del 11º mes del año 8 de la era común. No molesta a un SimpleDateFormat con la configuración predeterminada de que solo hay 30 días en noviembre, solo continúa contando en los siguientes meses y años, terminando en una fecha cinco años y medio después (2008 dividido por 365.25 está muy cerca de 5.5)

Pregunta: ¿Puedo usar java.time con mi versión de Java?

Si usa al menos Java 6 , puede hacerlo.

  • En Java 8 y versiones posteriores, la nueva API viene incorporada.
  • En Java 6 y 7, obtenga el Backport ThreeTen, el backport de las nuevas clases (ThreeTen para JSR 310, donde se describió por primera vez la API moderna).
  • En Android (anterior), use la edición de Android de ThreeTen Backport. Se llama ThreeTenABP. Asegúrese de importar las clases de fecha y hora del paquete org.threeten.bp y subpaquetes.

Campo de golf