Ieri ho avuto lo stesso problema. Vivo nel fuso orario CET (Central European Time) e la semplice creazione della cella DateTime
ha spostato il tempo di circa un'ora.
Inizialmente ho provato a impostare il fuso orario su GMT
come suggerito nel tutorial ufficiale.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT"));
Sembra non funzionare. La modifica del tempo era ancora la stessa. Così ho provato a impostare il fuso orario corretto per abbinare il fuso orario in un oggetto Date
.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("CET"));
Questo ha funzionato perfettamente come mi aspettavo. Ma le cose non devono essere troppo facili, eccetto CET timezone anche CEST (Central European Summer Time) che sposta il tempo di un'altra ora. Quando ho provato a utilizzare le date in ora CEST, non ha funzionato di nuovo perché c'era un'aggiunta di un'ora alla base prevista. Immagino che sarebbe la soluzione per impostare il fuso orario "CEST" invece di "CET" per loro ma non ho capito come ottenere il fuso orario corretto dal Calendar
, sempre restituito CET.
Finalmente ho usato una soluzione non bella, ma affidabile.
- ho un metodo factory per la cella della data di avere una configurazione in un unico luogo
- a quel metodo, converto il data
Date
di essere nel fuso orario GMT in un primo momento
- impostare il formato di fuso orario per GMT
- disabilita la modifica del fuso orario nella cella
DateTime
.
Questi passaggi non sono assolutamente puliti ma funzionano per le date CET e CEST.Il codice finale è qui:
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;
}
}
}
E c'è un metodo factory
/** 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);
}
Grazie per la risposta, ma il problema appaiono ancora: se uso la data e nel costruttore ho messo il DateTime.GMT , l'ora è GMT, e se non metto DateTime.GMT è GMT. Sembra che DateTime usi solo GMT e non il mio fuso orario ... – Enrico