Ayer tuve un problema similar. Vivo en la zona horaria CET (hora de Europa Central) y la creación simple de la celda DateTime
movió el tiempo aproximadamente una hora.
Al principio traté de configurar la zona horaria en GMT
como se sugiere en el tutorial oficial.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT"));
Parece que no funciona. La modificación de tiempo seguía siendo la misma. Así que traté de configurar la zona horaria correcta para que coincida con la zona horaria en un objeto Date
.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("CET"));
Esto funcionó perfectamente como esperaba. Pero las cosas no son demasiado fáciles, excepto por la zona horaria CET también CEST (horario de verano de Europa Central) que mueve el tiempo aproximadamente una hora más. Cuando traté de usar fechas en CEST, no funcionó porque había una hora adicional a la base esperada. Supongo que sería una solución para configurar la zona horaria "CEST" en lugar de "CET" para ellos pero no encontré la manera de obtener la zona horaria adecuada a partir del Calendar
, siempre devolvía CET.
De todos modos, finalmente, he utilizado una solución no es agradable, pero trabajando de forma fiable.
- tengo un método de fábrica para la celda de fecha para tener una configuración en un solo lugar
- en ese método, convierto lo dado
Date
estar en GMT zona horaria en un primer momento
- configurar el formato de zona horaria a GMT
- desactivar la modificación zona horaria en
DateTime
celular.
Estos pasos no son del todo limpios pero funcionan tanto para CET como para CEST.El código final está aquí:
public class DateUtils {
// formatter to convert from current timezone
private static final SimpleDateFormat DATE_FORMATTER_FROM_CURRENT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// formatter to convert to GMT timezone
private static final SimpleDateFormat DATE_FORMATTER_TO_GMT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static {
// initialize the GMT formatter
final Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
DATE_FORMATTER_TO_GMT.setCalendar(cal);
}
public static Date toGMT(final Date base) {
try {
// convert to string and after that convert it back
final String date = DATE_FORMATTER_FROM_CURRENT.format(base);
return DATE_FORMATTER_TO_GMT.parse(date);
} catch (ParseException e) {
log.error("Date parsing failed. Conversion to GMT wasn't performed.", e);
return base;
}
}
}
Y no es un método de fábrica
/** builds date cell for header */
static WritableCell createDate(final int column, final int row, final Date value) {
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT"));
final WritableCellFormat formatDate = new WritableCellFormat(valueFormatDate);
// create cell
return new DateTime(column, row, toGMT(value), formatDate, DateTime.GMT);
}
Gracias por la respuesta, pero el problema todavía aparece: si uso la fecha y en el constructor me puso el DateTime.GMT , la hora es GMT, y si no pongo DateTime.GMT es GMT. Parece que DateTime usa solo GMT y no mi zona horaria ... – Enrico