Tengo una cadena de fecha y quiero analizarla a la fecha normal, use la API de fecha de Java, el siguiente es mi código:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Sin embargo, tengo una excepción: java.lang.IllegalArgumentException: Illegal pattern character 'T'
¿Entonces me pregunto si tengo que dividir la cadena y analizarla manualmente?
Por cierto, he intentado agregar un carácter de comilla simple a cada lado de la T:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Tampoco funciona.
java
date
simpledateformat
iso8601
Hguser
fuente
fuente
T
representa el tiempo y es parte de la ISO8601 estándar de tiempo internacional fecha de formateo.T
comillas simples funcionó para mí (al menos en términos de resolución del error de análisis).Respuestas:
Actualización para Java 8 y superior
Ahora puede simplemente hacer
Instant.parse("2015-04-28T14:23:38.521Z")
y obtener lo correcto ahora, especialmente porque debería usarlo enInstant
lugar de lo rotojava.util.Date
con las versiones más recientes de Java.Debería usar en
DateTimeFormatter
lugar deSimpleDateFormatter
también.Respuesta original
Esto funciona con la entrada con el seguimiento
Z
como se demuestra:Q2597083.java
Produce el siguiente resultado:
fuente
tl; dr
Utilice la
java.time.Instant
clase para analizar texto en formato estándar ISO 8601, que representa un momento en UTC.ISO 8601
Ese formato está definido por el estándar ISO 8601 para formatos de cadena de fecha y hora.
Ambos:
… Usa los formatos ISO 8601 de forma predeterminada para analizar y generar cadenas.
En general, debe evitar el uso de las antiguas clases java.util.Date /.Calendar & java.text.SimpleDateFormat, ya que son notoriamente problemáticas, confusas e imperfectas. Si es necesario para interoperar, puede convertir de aquí para allá.
java.time
Integrado en Java 8 y posterior está el nuevo marco java.time . Inspirado por Joda-Time , definido por JSR 310 , y ampliado por el proyecto ThreeTen-Extra .
Convierte a la vieja clase.
Zona horaria
Si es necesario, puede asignar una zona horaria.
Convertir.
Joda-Time
ACTUALIZACIÓN: El proyecto Joda-Time ahora está en modo de mantenimiento. El equipo aconseja la migración a las clases java.time .
Aquí hay un código de ejemplo en Joda-Time 2.8.
Convierte a clase antigua. Tenga en cuenta que la zona horaria asignada se pierde en la conversión, ya que a juDate no se le puede asignar una zona horaria.
Zona horaria
Si es necesario, puede asignar una zona horaria.
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.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 Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
Hay dos respuestas anteriores hasta ahora y ambas son largas (y tl; dr demasiado cortas en mi humilde opinión), así que escribo un resumen de mi experiencia comenzando a usar la nueva biblioteca java.time (aplicable como se señala en otras respuestas a la versión de Java 8+). ISO 8601 establece la forma estándar de escribir fechas:
YYYY-MM-DD
por lo tanto, el formato de fecha y hora es solo el siguiente (podría ser 0, 3, 6 o 9 dígitos por milisegundos) y no se necesita una cadena de formato:No lo necesitaba, pero como obtener el año está en el código de la pregunta, entonces:
es más complicado, no se puede hacer
Instant
directamente, se puede hacer a travésCalendar
de preguntas Obtenga el valor entero del año actual en Java y Convertir Java. tiempo para el calendario, pero en mi humilde opinión ya que el formato es fijo, la subcadena es más fácil de usar:fuente