2012-05-23 10 views
9

Ok, así que tengo una cadena, diga "mar 21 de mayo 14:32:00 GMT 2012" Quiero convertir esta cadena a la hora local en el formato 21 de mayo , 2012 2:32 p. M. Intenté SimpleDateFormat ("MM dd, aaaa hh: mm a"). Parse(), pero arrojó una excepción. ¿Entonces qué debo hacer?Java/Android - Convierta una cadena de tiempo GMT a hora local

La excepción es "excepción no notificada java.text.ParseException; debe capturarse o declararse lanzada".

en la línea Date date = inputFormat.parse(inputText);

El código me encontré en TextMate:

public class test{ 
    public static void main(String arg[]) { 
     String inputText = "Tue May 22 14:52:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat(
      "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
     SimpleDateFormat out = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     Date date = inputFormat.parse(inputText); 
     String output = out.format(date); 
     System.out.println(output); 
    } 
} 
+0

¿Cuál es la excepción? –

+0

¿cuál fue la excepción? – Jeshurun

+0

Su texto de ejemplo arriba es el 21, que es un lunes, no un martes. Diferente del código de ejemplo. –

Respuesta

20

La cadena de formato que ya ha proporcionado para analizar no se corresponde con el formato de texto que en realidad tiene. Primero debe analizar y luego formatear. Parece que usted quiere:

SimpleDateFormat inputFormat = new SimpleDateFormat(
    "EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

SimpleDateFormat outputFormat = new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
// Adjust locale and zone appropriately 

Date date = inputFormat.parse(inputText); 
String outputText = outputFormat.format(date); 

EDIT: Aquí está el mismo código en la forma de un programa corto pero completo, con su entrada de la muestra:

import java.util.*; 
import java.text.*; 

public class Test { 
    public static void main(String[] args) throws ParseException { 
     String inputText = "Tue May 21 14:32:00 GMT 2012"; 
     SimpleDateFormat inputFormat = new SimpleDateFormat 
      ("EEE MMM dd HH:mm:ss 'GMT' yyyy", Locale.US); 
     inputFormat.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 

     SimpleDateFormat outputFormat = 
      new SimpleDateFormat("MMM dd, yyyy h:mm a"); 
     // Adjust locale and zone appropriately 
     Date date = inputFormat.parse(inputText); 
     String outputText = outputFormat.format(date); 
     System.out.println(outputText); 
    } 
} 

¿Puede compilar y ejecutar que el código exacto?

+1

Lo intenté pero la línea Fecha date = inputFormat.parse (inputText); aún lanzar la excepción que mencioné arriba :( – Manto

+0

@ user1066956: Por favor, publique la cadena * exacta * involucrada entonces - porque usé la cadena que me dio en la pregunta, y estaba bien. –

+0

"Mar 21 de mayo 14:32:00 GMT 2012 "es la cadena exacta que utilicé. Ejecuté el siguiente código en TextMate y obtuve el error que mencioné anteriormente. – Manto

3

El formateador que utiliza para analizar debe estar definido con el formato que espera. Aquí hay un ejemplo que funciona para los valores que nos ha facilitado, sin embargo puede que tenga que cambiar dependiendo de cómo actúan algunos casos límite para la entrada:

String date = "Tue May 21 14:32:00 GMT 2012"; 
DateFormat inputFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zz yyy"); 
Date d = inputFormat.parse(date); 
DateFormat outputFormat = new SimpleDateFormat("MMM dd, yyy h:mm a zz"); 
System.out.println(outputFormat.format(d)); 
1

El método SimpleDateFormat.parse emite una excepción de análisis.

La excepción que está recibiendo le está diciendo esto ...

La excepción es "no declarada java.text.ParseException excepción;. debe estar atrapado o declarada a ser lanzado"

Wrap la línea que hace el análisis con el try-catch y que debe ser de oro ..

Date d=null; 
try{ 
    d = inputFormat.parse(date); 
catch(ParseException e){ 
    // handle the error here.... 
} 

R

1

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.

Cuestiones relacionadas