Java 8 DateTime fecha API de análisis de cadenas cuando se desconocen tanto el patrón y el valor

BenW:

Tengo un requisito para analizar una cadena de hora fecha desconocida utilizando un formato de fecha desconocida, pero también se suministra. Quiero analizar a una ZonedDateTime. Si no existe una zona contenida en la cadena de patrón, quiero suponer zona UTC. El problema es que no estoy seguro de cómo determinar si la cadena patrón contiene información de zona horaria para que yo pueda añadir .withZone(ZoneOffset.UTC)cuando se crea el DateTimeFormatter. ¿Cómo debe hacerse esto?

String dateTimeFormat = "yyyy-MM-dd HH:mm:ss Z"; // this will be unknown (could be any possible valid pattern)
String dateTimeValue = "2001-01-01 00:00:00 -0800"; // this will also be unknown

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormat);
if(????) { // how to determine if the pattern contains timezone information
    dateTimeFormatter = dateTimeFormatter.withZone(ZoneOffset.UTC);
}

ZonedDateTime dateTime = ZonedDateTime.parse(dateTimeValue, dateTimeFormatter);
Albahaca Bourque:

Su patrón de ejemplo el formato no es correcto para la DateTimeFormatterclase. Por ejemplo mayúscula YYYYsignifica un año a base de semanas, no es probable que la intención del emisor. Los DDmedios días de año (1-366), de nuevo, no es probable la intención del emisor.

DateTimeFormatter códigos de formato

Tendrá que aprender los códigos que se pasa a usted en dichas cadenas. A continuación, tendrá que traducir a los códigos de patrones de formato apropiados utilizados por la DateTimeFormatterclase.

DateTimeFormatterBuilder

Es probable que se beneficiaría del uso de la muy flexible y potente DateTimeFormatterBuilderclase donde se puede construir un formato de múltiples llamadas. Después de todas las llamadas necesarias, que finalmente genera un DateTimeFormatterllamando DateTimeFormatterBuilder::toFormatter.

Buscar desbordamiento de pila de ejemplos que utilizan esta clase.

Otros asuntos

cómo determinar si la cadena patrón contiene información de zona horaria

El Zen el formato de código pasado te dice.

Puedo añadir .withZone (ZoneOffset.UTC)

Si usted está tratando de adaptarse a UTC, hacer eso después de haber analizado la cadena de entrada en un objeto de fecha y hora. Para llegar a UTC, simplemente llamar toInstant, como Instantsiempre en UTC, por definición.

No estoy ajustando a UTC, quiero establecer la zona como UTC si no hay una zona especificada en el patrón.

Si su cadena de entrada carece de cualquier indicador de zona horaria o compensar-from-UTC, a continuación, analizar como LocalDateTime. Esa clase carece de cualquier propósito concepto de zona horaria o compensar-from-UTC. Como tal, un LocalDateTimequé no representan un momento, es decir , no un punto en la línea de tiempo.

Si usted sabe con certeza la cadena sin zona / desplazamiento fue de hecho que realmente se refiere a una zona particular / offset, a continuación:

Con una OffsetDateTimeo ZonedDateTime, ahora tiene un momento, un momento en el tiempo.

Lo que se compensa la diferencia entre zona y? Un desplazamiento es simplemente un número de horas-minutos-segundos, nada más. Una zona, por el contrario, es mucho más. Una zona es una historia de los pasados, presentes y futuros cambios en el desplazamiento utilizado por los habitantes de una región en particular.

LocalDateTime ldt = LocalDateTime.parse( "2018-01-23T01:23:45.123" ) ;  // *Not* a moment, *not* a point on the timeline.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ; // Assign an offset to determine a moment.

Usted parece estar demasiado centrado en el análisis como una manera de aplicar la lógica de negocio. En su lugar, hacer su análisis tan simple y directo como sea posible para obtener un objeto java.time que coincida con el de entrada. Sólo después de que el análisis debe ser hacer ajustes o transformaciones en su valor de fecha y hora. Por último separar tanto este análisis y el código de transformación de su otro trabajo de la lógica de negocio, por lo que tiene tres fases distintas: (1) simplemente / directamente de análisis, (2) ajustar / transformar valor, (3) utilizar el valor de fecha y hora para el objetivo comercial.

ISO 8601

Este proyecto suyo está lleno de riesgos. Asumiendo la responsabilidad de alguien más entradas cadena arbitraria con su propio inventaron los códigos de formato es algo que me gustaría simplemente se niegan a hacerlo. El éxito o el fracaso está fuera de su control, ya que nunca se puede saber completamente lo que va a llegar.

El enfoque más prudente es transferir la carga a la fuente de estos datos entrante. Deben estar pasando las cuerdas en la norma ISO 8601 de formato. Esa norma fue ideado precisamente para este propósito, el intercambio de los valores de fecha y hora como texto. Los formatos estándar son hábilmente diseñados para ser inequívoca y fácil de analizar por la máquina, así como fácil de leer por los seres humanos en todas las culturas.

Los java.time clases utilizan la norma ISO 8601 formatos por defecto cuando el análisis / generación de cadenas. La ZonedDateTimeclase extiende sabiamente el estándar añadiendo nombre de la zona horaria entre corchetes. Yo aconsejaría a la fuente de los datos para hacer lo mismo si van a enviar un valor por zonas - por lo general la mejor manera de intercambiar valores solo UTC.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=205377&siteId=1
Recomendado
Clasificación