Pregunta

¿Hay una manera de forzar el tiempo de Joda para analizar fechas solo cuando contienen años de cuatro dígitos? Por ejemplo:

  • 2009-11-11 - debería analizar
  • 09-11-11: no se debe analizar

Probé el siguiente código:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

Analiza en 0009-11-11. Al parecer, los minDigits en el método appYYear solo se usan para formatear al imprimir la fecha.
El resultado es el mismo si uso appendYearOfEra (). Si uso appendYearOfCentury (), en cambio, analiza el año en 1909.

Estamos implementando un analizador de datos general, que reconocerá varios tipos de entradas. También el ejemplo es una forma abreviada del trato real (por simplicidad). Los escenarios de la vida real analizan fechas que pueden tener días de la semana, meses como palabras, hora, zona y diferentes caracteres que separan mes, día y año. Por lo tanto, escribir un RegEx o verificar el contenido / longitud de la cadena puede resultar bastante difícil.

Algunos ejemplos reales podrían verse así:

  • 2009-11-11
  • miércoles 2009-11-11T15: 00: 00
  • 2009/11/11 15:00
  • y muchos más ...
¿Fue útil?

Solución

DateTimeFormatterBuilder.appendFixedDecimal () bien puede hacer lo que necesitas.

Alternativamente, puedes implementar la interfaz DateTimeParser para crear cualquier analizador que desees y pasarlo a DateTimeFormatterBuilder.

Otros consejos

Puedes verificar la longitud de la cadena de fecha.

Puede crear analizadores y formateadores extremadamente específicos utilizando DateTimeFormatterBuilder . En general, no es necesario usar esta clase directamente, ya que los formatos más comunes están disponibles más fácilmente en otras partes de la API, pero esta es la clase de constructor que todos usan bajo las cubiertas.

¿Qué desea obtener de un usuario que ingresa '0001-01-01' como fecha (es decir, ingresó 4 dígitos para el año, pero los tres primeros fueron ceros)? ¿Qué pasa con '0999-12-31'? Y '999-12-31'? ¿Y qué hay de '10000-01-01' - el infame Y10K 1 ¿problema?

  • Si ese es un valor legítimo, entonces está atascado en descubrir la longitud de lo que el usuario escribió como la parte del año de la fecha (probablemente después de que se haya realizado cualquier otro análisis), y asegurarse de que esté en menos (¿o es exactamente?) cuatro dígitos.

  • Si ese no es un valor legítimo, entonces no puede verificar el valor del año una vez analizada la fecha.

  • O puede tomar el código y modificarlo para que incluya su definición preferida de año válido.


1 No planeo comenzar a trabajar para solucionar el problema del Y10K antes del 5000-01-02.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top