Cómo analizar la cadena "Mon Aug 08 16:44:19 EAT 2016" hasta la fecha en android

private void parseDate() { String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016"; SimpleDateFormat lv_formatter,lv_parser; String lv_localTimeZone =""; lv_localTimeZone="EAT"; Date lv_localDate = null; lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy"); lv_parser.setTimeZone(TimeZone.getTimeZone(lv_localTimeZone)); try { lv_localDate = lv_parser.parse(p_localDateTime); } catch (ParseException e) { e.printStackTrace(); } System.out.println("convertLocalTimeToUTC: "); } 

He intentado analizar esta fecha usando 3 diferentes formatos de zona 'z', 'zzz', 'zzzz' pero todos los tiros java.text.ParseException: Unparseable date: "Mon Aug 08 16:44:19 EAT 2016" 20)

Está utilizando clases de fecha y hora viejas problemáticas ahora suplantadas por las clases java.time.

Uso de java.time

Evite usar EAT como una zona. Nunca utilice la abreviatura de 3-4 letras como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!). Especifique un nombre de zona horaria adecuado . En este caso particular, java.time es capaz de traducir eso como zona de Africa/Nairobi .

 String input = "Mon Aug 08 16:44:19 EAT 2016"; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" ).withLocale ( Locale.US ); ZonedDateTime zdt = ZonedDateTime.parse ( input , f ); 

Descarga en la consola. El método toString genera una cadena en el formato estándar ISO 8601 , extendida añadiendo 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: 2016-08-08T16: 44: 19 + 03: 00 [África / Nairobi]

Acerca de java.time

El framework java.time está integrado en Java 8 y posterior. Estas clases suplantan las viejas clases problemáticas de fecha y hora, como java.util.Date , .Calendar , y java.text.SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , recomienda la migración a java.time.

Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones.

Gran parte de la funcionalidad de java.time es back-portada a Java 6 & 7 en ThreeTen-Backport y adaptada además a Android en ThreeTenABP (consulte Cómo usar … ).

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno probatorio para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles como Interval , YearWeek , YearQuarter y más.

Debe agregar la configuración regional:

 lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH); 

Ejemplo Completo:

  String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016"; SimpleDateFormat lv_formatter,lv_parser; String lv_localTimeZone =""; lv_localTimeZone="EAT"; Date lv_localDate = null; lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy"); lv_parser.setTimeZone(TimeZone.getTimeZone(lv_localTimeZone)); try { lv_localDate = lv_parser.parse(p_localDateTime); } catch (ParseException e) { e.printStackTrace(); } System.out.println("convertLocalTimeToUTC: "); 

Como se menciona en el enlace siguiente parece que Timezone no acepta el formato "ZZZ" según la documentación de SimpleDateFormat. El enlace es: Simpledateformat ParseException

Pude resolver esto mencionando la zona como "hora del este de África" ​​en vez de "COMA" y el código es:

  public void dateFormatter() { String dateString = "Mon Aug 23 8:42:19 East Africa Time 2016"; String dateFormat= "EEE MMM dd HH:mm:ss z yyyy"; SimpleDateFormat setDateFormatter; Date formattedDate = null; if(!dateString.isEmpty()) { setDateFormatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH); try { formattedDate = setDateFormatter.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } } System.out.println("Formatted Date: " + formattedDate); } 

No hay error de mi parte para el código. Me cambio un poco intentar dar salida al resultado y conseguir esto

"ConvertLocalTimeToUTC: lun Aug 08 21:44:19 SGT 2016"

 package self.test.out; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class DateParseTest { public static void main(String[] args) { String p_localDateTime = "Mon Aug 08 16:44:19 EAT 2016"; SimpleDateFormat lv_formatter,lv_parser; String lv_localTimeZone =""; lv_localTimeZone="EAT"; Date lv_localDate = null; lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); //lv_parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy"); lv_parser.setTimeZone(TimeZone.getTimeZone(lv_localTimeZone)); try { lv_localDate = lv_parser.parse(p_localDateTime); } catch (ParseException e) { e.printStackTrace(); } System.out.println("convertLocalTimeToUTC: "+lv_localDate); } } 

Usando Jdk1.6

Esta es una función de utilidad que utilizo en mis proyectos. Simplemente pasa la cadena y el formato de la fecha. En este caso el formato de la fecha sería "EEE MMM dd HH: mm: ss Z aaaa". Espero que sea útil.

 public static Date dateFormatter(String dateString, String dateFormat) { SimpleDateFormat setDateFormatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH); Date formattedDate = null; if (!dateString.isEmpty()) { try { formattedDate = setDateFormatter.parse(dateString); } catch (ParseException e) { Log.e(TAG, "Parse Exception Error : " + e.getMessage()); } } return formattedDate; } 
  • Gradle no puede resolver dependencias en Android Studio
  • Señal fatal 11 (SIGSEGV) en 0x00000000 (código = 1) - PhoneGap
  • Acceso string.xml al código java en Android
  • Android "gps requiere ACCESS_FINE_LOCATION" error, aunque mi archivo de manifiesto contiene este
  • Eclipse
  • Conjunto de subprocesos en Java
  • Fragmento de Android objeto nulo mNextAnim Crach interno
  • Cómo configurar ProGuard para omitir métodos con SupressWarning ("unused")
  • Google Play detecta nuevos permisos después de usar Android Studio
  • Ejecutar el comando shell desde android
  • Android Studio, ProGuard no puede calcular hash de Classes.jar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.