Saltar al contenido

Cómo convertir una fecha en este formato (martes 13 de julio 00:00:00 CEST 2010) a una fecha de Java (la string proviene de una propiedad al aire libre)

Recuerda que en las ciencias informáticas un error casi siempre tiene diferentes soluciones, pero compartiremos la mejor y más óptimo.

Solución:

Básicamente tu el problema es que está utilizando un constructor SimpleDateFormat (patrón de cadena), donde javadoc dice:

Construye un SimpleDateFormat utilizando el patrón dado y los símbolos de formato de fecha predeterminados para el configuración regional predeterminada.

Y si intentas usar este código:

DateFormat osLocalizedDateFormat = new SimpleDateFormat("MMMM EEEE");
System.out.println(osLocalizedDateFormat.format(new Date()))

notará que imprime los títulos de mes y día de la semana según su ubicación.

La solución a tu problema es para anular la configuración regional de fecha predeterminada utilizando el constructor SimpleDateFormat(String pattern, Locale locale):

DateFormat dateFormat = new SimpleDateFormat(
            "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
dateFormat.parse("Tue Jul 13 00:00:00 CEST 2011");
System.out.println(dateFormat.format(new Date()));

Según sus comentarios, creo que su propiedad es en realidad del tipo d:fecha o d: fecha y hora. Si es así, la propiedad ya volverá de Alfresco como un objeto Date de Java. Entonces, todo lo que necesitas hacer es:

  NodeRef risposta = childAssocRef.getChildRef();
  Date dataRisposta = (Date)nodeService.getProperty(risposta, AlfrescoConstants.QN_DATA_RISPOSTA);

tl; dr

ZonedDateTime.parse(                     // Produce a `java.time.ZonedDateTime` object.
    "Wed Jul 13 00:00:00 CEST 2011" ,    // Corrected `Tue` to `Wed`.
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US  ) 
)

2011-07-13T00:00+02:00[Europe/Paris]

Datos incorrectos: Wed contra Tue

tu ingresas string Tue Jul 13 00:00:00 CEST 2011 es inválido. El 13 de julio de 2011 fue miércoles, no un martes.

String input = "Wed Jul 13 00:00:00 CEST 2011" ;  // Corrected `Tue` to `Wed`.

captura de pantalla del calendario de julio de 2011 en el motor de búsqueda Duck Duck Go

java.tiempo

El enfoque moderno utiliza las clases java.time en lugar de las antiguas y problemáticas clases heredadas de fecha y hora que se ven en otras respuestas.

Defina un patrón de formato para que coincida con su entrada string. Observe la Localeque define el lenguaje humano que se utilizará para analizar el nombre del mes y el nombre del día de la semana.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss zzz uuuu" , Locale.US  );
ZonedDateTime zdt = ZonedDateTime.parse( input , f  );

zdt.toString(): 2011-07-13T00:00+02:00[Europe/Paris]

Zona horaria

Su CEST es una pseudo-zona, no una true zona horaria. Nunca use estos. No están estandarizados y ni siquiera son únicos (!).

Él ZonedDateTime La clase hará un valiente esfuerzo por adivinar la intención detrás de una pseudo-zona de 3-4 caracteres. Su CEST pasó a trabajar aquí, interpretado como Europe/Paris zona horaria. Pero no puede confiar en que la conjetura sea 100% exitosa. En cambio, evitar tales pseudo-zonas por completo.

Especifique un nombre de zona horaria adecuado en el formato de continent/regioncomo America/Montreal, Africa/Casablancao Pacific/Auckland.

ZoneId z = ZoneId.of( "Europe/Paris" );  // https://time.is/Paris
LocalDate today = LocalDate.now( z );  // Current date varies around the globe by zone.

ISO 8601

Tu aportación stringEl formato de es terrible. Al serializar valores de fecha y hora como texto, use solo los formatos estándar ISO 8601.

Él ZonedDateTime La clase amplía sabiamente el formato estándar agregando el nombre de la zona horaria entre corchetes, como se ve en los ejemplos anteriores.


Acerca de java.time

El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases reemplazan a las antiguas y problemáticas clases heredadas de fecha y hora, como java.util.Date, Calendar& 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 Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9y después
    • Incorporado.
    • Parte de la API de 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 está adaptada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time (JSR 310).
    • Para Android anterior, el TresDiezABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

Él ThreeTen-Extra proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuartery más.

Nos puedes añadir valor a nuestro contenido participando con tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *