Estoy buscando una clase de fecha única serializable adecuada. Tengo un servidor en el huso horario central, quiero que los usuarios en el este ingresen la fecha como 2010-11-23, y los usuarios en el Pacífico lo vean como 2010-11-23 (y viceversa).Joda LocalDate, ¿aún un instante?
java.util.Date
es un instante sensible al tiempo, por lo que no funciona para mí. No queriendo reinventar la rueda, decidí darle una oportunidad a Joda Time. Según la descripción general, LocalDate
es una "clase que representa una fecha local sin tiempo (sin zona horaria)", justo lo que necesito.
Desafortunadamente, no parece ser zona horaria independiente. En la base de datos tengo 2010-11-23. En el servidor, lo transformo en LocalDate
con new LocalDate(java.sql.Date)
. date.toString()
prints 2010-11-23.
Después de deserializar que en el cliente, date.ToString()
impresiones 2010-11-22 date.getDayOfMonth()
y es 22. Pero date.toDateTimeAtStartOfDay()
produce 2010-11-23T00: 00: 00,000 a 08: 00.
¿Estoy haciendo algo mal? ¿Hay una clase insensible a la zona horaria apropiada solo para la fecha en Joda?
EDIT: En la base de datos estoy usando una columna insensible a la zona horaria (DATE
en Postgres). El servidor está en la misma zona horaria que la base de datos, por lo que lee bien la fecha. No es un problema. Estoy buscando un tipo de Java que una vez instanciado en una zona horaria, tenga el mismo valor de fecha civil (parcial) en todas las zonas horarias.
EDIT 2: en el servidor, todo está cargado correctamente y tiene zona horaria UTC. Después de la investigación, creo que es un error en ISOChronology
. En el cliente, se desempaqueta como America/Los_Angeles. La razón es que la serialización se hace con:
class ISOChronology {
// ...
private Object writeReplace() {
return new Stub(getZone());
}
private static final class Stub implements Serializable {
private static final long serialVersionUID = -6212696554273812441L;
private transient DateTimeZone iZone;
Stub(DateTimeZone zone) {
iZone = zone;
}
private Object readResolve() {
return ISOChronology.getInstance(iZone);
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(iZone);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
iZone = (DateTimeZone)in.readObject();
}
}
}
Buena suerte en la serialización con un campo transitorio.
Si quiere ignorar la zona horaria, ¿puede usar UTC/GMT en todos los lugares? –
¿Qué versión de Joda estás usando y cómo se serializan los objetos? Para la serialización Java estándar, la clase Stub tiene los métodos writeObject/readObject adecuados para el manejo "manual" del campo iZone, pero esto puede fallar con otras implementaciones de serialización como IIOP, SOAP o cualquier otra cosa que intente extraer automáticamente valores de campo de instancias de objeto . – jarnbjo
@jarnbjo 1.6.2. El serializador está bien, el problema como señalé anteriormente es que 'Stub.iZone' es transitorio. –