sirve - java.text.ParseException: fecha indescargable
string to date java (8)
Estoy analizando la excepción mientras trato de seguir el código
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Excepción
Exception in thread "main" java.text.ParseException: Unparseable date: "Sat Jun 01 12:53:10 IST 2013"
at com.ibm.icu.text.DateFormat.parse(DateFormat.java:510)
input: Sat Jun 01 12:53:10 IST 2013
Salida esperada: Jun 01,2013 12:53:10
¿Cómo resolver esto?
Actualiza tu formato a:
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
El patrón está mal
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Encontré una solución simple para obtener la fecha actual sin ningún error de análisis.
Calendar calendar;
calendar = Calendar.getInstance();
String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH);
Necesitaba agregar una expresión de ParsePosition
al método de análisis de la clase SimpleDateFormat
:
simpledateformat.parse(mydatestring, new ParsePosition(0));
Su patrón no se corresponde con la cadena de entrada en absoluto ... No es sorprendente que no funcione. Esto probablemente funcionaría mejor:
SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",
Locale.ENGLISH);
Luego, para imprimir con el formato requerido, necesita un segundo SimpleDateFormat:
Date parsedDate = sdf.parse(date);
SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
System.out.println(print.format(parsedDate));
Notas:
- debe incluir la configuración regional como si su configuración regional no fuera inglés, el nombre del día podría no ser reconocido
- IST es ambiguo y puede provocar problemas, por lo que debe usar el nombre de la zona horaria adecuada, si es posible en su entrada.
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");
Date currentdate=sdf.parse(date);
SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss");
System.out.println(sdf2.format(currentdate));
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Este patrón no coincide con la cadena de entrada que se produce con la excepción .
Debe usar el siguiente patrón para realizar el trabajo.
E MMM dd HH:mm:ss z yyyy
El siguiente código le ayudará a omitir la excepción .
SimpleDateFormat
se usa .
String date="Sat Jun 01 12:53:10 IST 2013"; // Input String
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern
Date currentdate=simpleDateFormat.parse(date); // Returns Date Format,
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern
System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern
// outputs: Jun 01,2013 12:53:10
- Su patrón de formato no coincide con la cadena de entrada, como se señala en otras respuestas.
- Tu formato de entrada es terrible .
- Está utilizando clases problemáticas antiguas de fecha y hora que fueron suplantadas hace años por las clases java.time .
ISO 8601
En lugar de un formato como el suyo, utilice los formatos estándar ISO 8601 para intercambiar valores de fecha y hora como texto.
Las clases java.time usan los formatos estándar ISO 8601 de forma predeterminada al analizar / generar cadenas.
Nombre correcto de la zona horaria
Especifique un nombre de zona horaria adecuada en el formato continent/region
, como America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. 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 (!).
Su IST
podría significar la hora estándar de Islandia , la hora estándar de la India , la hora estándar de Irlanda u otros. Las clases java.time se dejan simplemente adivinar, ya que no hay una solución lógica para esta ambigüedad.
java.time
El enfoque moderno usa las clases java.time .
Defina un patrón de formateo para que coincida con sus cadenas de entrada.
String input = "Sat Jun 01 12:53:10 IST 2013";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString (): 2013-06-01T12: 53: 10Z [Atlantic / Reykjavik]
Si su entrada no fue pensada para Islandia, debe analizar previamente la cadena para ajustar el nombre de la zona horaria. Por ejemplo, si está seguro de que la entrada fue para India, cambie IST
a Asia/Kolkata
.
String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
zdt.toString (): 2013-06-01T12: 53: 10 + 05: 30 [Asia / Kolkata]
Acerca de java.time
El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases legacy fecha y hora como java.util.Date
, java.util.Calendar y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Use un controlador JDBC que cumpla con JDBC 4.2 o posterior. Sin necesidad de cadenas, sin necesidad de clases java.sql.*
.
¿Dónde obtener las clases de java.time?
- Java SE 8 , Java SE 9 , Java SE 10 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Android
- Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
- Para Android anterior (<26), el proyecto ThreeTen-Backport adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ....
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 more .