2010-10-28 2 views
5

No entiendo por qué MutableDateTime.setDate() está ajustando el tiempo a "ayer" (ver las horas de marca de hora de registro - es 20:28). ¿Esta zona horaria está relacionada? ¿Debo configurar algo en el formateador?Joda Time restando 24 horas de una instancia de MutableDateTime, me gustaría saber por qué

Esperaría que después de llamar a setDate con "10/27/2010", la fecha sería la misma que la fecha analizada 00:00 EDT 10/27/10, en lugar de 20:28 EDT 10/26/10. Esto es hace 24 horas desde "ahora".

¿Qué me falta aquí, o cómo debería editar el código para obtener el resultado deseado? Soy nuevo en Joda Time y me gustaría resolver este misterio.

DateTimeFormatter dateFormatterJ = DateTimeFormat.forPattern("MM/dd/yyyy"); 
DateTimeFormatter timestampFormatJ = DateTimeFormat.forPattern("HH:mm zzz MM/dd/yy"); 

MutableDateTime startDate = new MutableDateTime(); 

log.info("parsed date " + 
    timestampFormatJ.print(dateFormatterJ.parseMutableDateTime(startDateString))); 

startDate.setDate((dateFormatterJ.parseMutableDateTime(startDateString))); 

log.info("startDate: " + timestampFormatJ.print(startDate)); 

En este caso, startDateString es simplemente "10/27/2010".

aquí es la salida del registro:

10-27 20:28:55 INFO parsed date: 00:00 EDT 10/27/10 
10-27 20:28:55 INFO startDate: 20:28 EDT 10/26/10 

Gracias

Respuesta

2

Al analizar una cadena que no contiene un desplazamiento GMT o de zona horaria de identificación, debe hacer una de tres cosas:

  • no hacer nada, y aceptar que la serie se analiza en la zona horaria predeterminada
  • especificar la zona horaria para analizar en el uso de withZone() en el formateador
  • uso parseLocalDate() instea d de parseMutableDateTime()

La última es la solución preferida, ya que correctamente analiza los datos que fueron en realidad de entrada, que era una fecha sin tiempo, desplazamiento o zona.

El uso de parseLocalDate() en el código de prueba analiza correctamente la fecha.

+1

un google para + "parseLocalDate" + joda devuelve una sola publicación de grupos de google desde junio y algún código en GWT. Lo intenté usando withZone() antes de mirar la fuente y el resultado es el mismo. Parece que aunque especifico una zona, el código en MutableDateTime lo ve en mi Cronología, luego lo cambia y lo convierte en UTC en lugar de desplazarlo a la zona horaria de MutableDateTime. – Affe

4

La respuesta simple sería, porque el javadoc lo dice.

pública setDate vacío (ReadableInstant instantánea)

Establecer la fecha de otro instantánea. La parte de tiempo de este objeto no se verá afectada.

Parámetros: instantáneos - un instante para copiar la fecha de, tiempo parcial ignorado

Lanza: IllegalArgumentException - si el objeto es invalidobject no es válido

Cuando Joda dice 'Fecha 'significa el significado humano de la palabra Fecha. "La porción de este valor del año-mes-día", no el equivalente lógico de un java.util.Date. (Todo el punto de joda siendo introducir algunos, sensible, la semántica naturales hasta la fecha y la hora de su uso.)

EDIT: Para responder a su pregunta 'cómo solucionar', simplemente hacer:

MutableDateTime startDate = new MutableDateTime(dateFormatterJ.parseMutableDateTime(startDateString)); 

O de lo contrario, ponga a cero manualmente las partes de tiempo, por supuesto.

EDIT 2: Hmm, aparentemente no leí con cuidado, esto es solo la mitad de la respuesta. Comprobará.

EDIT 3: bueno esto me molestó tanto que me tomé un minuto para buscarlo.

public void setDate(final ReadableInstant instant) { 
    long instantMillis = DateTimeUtils.getInstantMillis(instant); 
    Chronology instantChrono = DateTimeUtils.getInstantChronology(instant); 
    DateTimeZone zone = instantChrono.getZone(); 
    if (zone != null) { 
     instantMillis = zone.getMillisKeepLocal(**DateTimeZone.UTC**, instantMillis); 
    } 
    setDate(instantMillis); 
} 

Por alguna razón, está pasando su tiempo absoluto hacia UTC antes de establecer la fecha. Así que le das el 27/10/2010 a las 00:00 EDT y establece la magnitud absoluta del tiempo en la cantidad de milisegundos que representan el 27/10/2010 a las 00:00 UTC, que por supuesto son solo las 6 o las 7 PM del día anterior . Luego encuentra que el valor de fecha EDT de eso es 10/26.

no podía decir si esa es la intención de alguna manera o si se trata de un error que ha estado allí durante 2 años o qué.)

+0

Gracias, Affe. Su solución de actualizar el MutableDateTime con la cadena de fecha analizada en lugar de usar setDate() funcionó. La explicación sobre la causa raíz también es muy apreciada. Yo interpretaría esto como un error, pero puede haber opiniones diferentes. –

+0

He creado un ticket para este problema - https://sourceforge.net/tracker/?func=detail&aid=3097754&group_id=97367&atid=617889 –

Cuestiones relacionadas