Wczoraj miałem ten sam problem. Mieszkam w strefie czasowej CET (czas środkowoeuropejski) i proste stworzenie komórki DateTime
przeniosło czas o około godzinę.
Najpierw próbowałem ustawić strefę czasową na GMT
, jak sugeruje oficjalny samouczek.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT"));
Wygląda na to, że nie działa. Zmiana czasu była wciąż taka sama. Tak więc próbowałem ustawić poprawną strefę czasową, aby dopasować strefę czasową do obiektu Date
.
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("CET"));
To działało idealnie, jak się spodziewałem. Ale rzeczy, które nie są zbyt łatwe, jest poza strefą czasową CET również CEST (środkowoeuropejski czas letni), który przesuwa czas o kolejną godzinę. Kiedy próbowałem używać dat w czasie CEST, to nie działało to ponownie, ponieważ była jedna godzina dodatku do oczekiwanej bazy. Myślę, że byłoby byłoby rozwiązaniem, aby ustawić strefę czasową "CEST" zamiast "CET" dla nich, ale nie wymyśliłem, jak uzyskać właściwą strefę czasową od Calendar
, zawsze zwracano CET.
W każdym razie w końcu użyłem niezłego, ale niezawodnie działającego rozwiązania.
- Mam metody fabryki dla data komórce mieć konfigurację na jednym miejscu
- w tej metodzie przekonwertować dany
Date
być w GMT strefy czasowej w pierwszym
- ustawić format strefę czasową GMT
- wyłączyć modyfikację strefy czasowej na komórce
DateTime
.
Kroki te nie są absolutnie czyste, ale działa zarówno w przypadku CET, jak i CEST.Ostateczny kod jest tutaj:
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;
}
}
}
i istnieje metoda fabryki
/** 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);
}
dziękuję za odpowiedź, ale problem nadal pojawiają się: jeśli używam datę i konstruktora Włożyłem DateTime.GMT , godzina to GMT, a jeśli nie ustawię DateTime.GMT to GMT. Wygląda na to, że DateTime używa tylko GMT, a nie mojej strefy czasowej ... – Enrico