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
-
Tutorial de Oracle: Fecha y hora
, explicando cómo usar
java.time
. - Proyecto ThreeTen Backport
- ThreeTenABP , edición de Android de ThreeTen Backport
- Pregunta: Cómo usar ThreeTenABP en Android Project , con una explicación muy detallada.
- Solicitud de especificación Java (JSR) 310 .