Está utilizando antiguas clases problemáticas de fecha y hora ahora suplantadas por las clases java.time.
datos de entrada erróneos
Su primera cadena de ejemplo es incorrecto, ya que el día 21 no es un lunes un martes. El segundo string de ejemplo con 22nd es correcto y se usa en mi código de ejemplo a continuación.
Usando java.time Evitar
el uso de este tipo de formato para representaciones textuales de los valores de fecha y hora. En particular, nunca use la abreviatura de 3-4 letras como EST
o IST
visto en este tipo de formato, ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!). Especifique un proper time zone name. En este caso particular, java.time puede traducirlo como GMT
como UTC, pero otros valores pueden fallar.
String input = "Tue May 22 14:52:00 GMT 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse (input , f);
System.out.println ("zdt: " + zdt);
Volcar a la consola. El método toString
genera una cadena en el formato estándar ISO 8601, extendido al agregar el nombre de la zona entre paréntesis. Estos formatos estándar son una opción mucho mejor para cuando necesita serializar valores de fecha y hora en texto.
System.out.println ("zdt: " + zdt);
zdt: 2012-05-22T14: 52Z [GMT]
Generar cadena
Puede generar una cadena para representar este valor en cualquier formato que desee. En general, es mejor dejar que java.time localize automáticamente usando Locale
y DateTimeFormatter
.
El formato deseado utiliza un estilo de longitud media para la parte de fecha pero un estilo de longitud corta para la parte de hora del día. Afortunadamente, el DateTimeFormatter
le permite localizar cada porción por separado, como se ve aquí donde pasamos un par de objetos FormatStyle
.
Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc.
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l);
String output = zdt.format (fOutput);
Volcar a la consola.
System.out.println ("zdt: " + zdt + " | output: " + output);
zdt: 2012-05-22T14: 52Z [GMT] | salida: 22 de mayo de 2012 14:52
Sobre java.time
java.time El marco está construido en Java 8 y versiones posteriores. Estas clases suplantan a las antiguas clases problemáticas de fecha y hora como java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a java.time.
Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.
Gran parte de la funcionalidad java.time está de vuelta-portado a Java 6 & 7 en ThreeTen-Backport y adaptado además para Android en ThreeTenABP (ver How to use…).
El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más.
¿Cuál es la excepción? –
¿cuál fue la excepción? – Jeshurun
Su texto de ejemplo arriba es el 21, que es un lunes, no un martes. Diferente del código de ejemplo. –