昨日私は同じ問題がありました。私はCETタイムゾーン(中央ヨーロッパ時間)に住んでいて、DateTime
セルの簡単な作成は約1時間の時間を移動しました。
最初に、公式チュートリアルで提案されているように、GMT
にタイムゾーンを設定しようとしました。
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT"));
これは機能していないようです。時間の変更はまだ同じでした。そこで、Date
オブジェクトのタイムゾーンと一致するように、正しいタイムゾーンを設定しようとしました。
final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm");
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("CET"));
これは期待どおりに機能しました。しかし、あまりにも簡単ではないことは、CETタイムゾーンを除いて、もう1時間ほど時間を動かすCEST(中央ヨーロッパ夏時間)です。 CEST時間で日付を使用しようとしたとき、予想ベースに1時間が追加されたため、再び機能しませんでした。私はのための "CET"の代わりに "CEST"タイムゾーンを設定する解決策だろうと思うが、私はCalendar
から適切なタイムゾーンを取得する方法を把握しなかった、それは常にCETを返した。
とにかく、私は最終的には良くないが、信頼性の高い解決策を使用しました。私はその方法で
1つの場所の設定を持つように日付セルのためのファクトリメソッドを持って
- 、私はにタイムゾーンの形式を設定する最初の
- でGMTタイムゾーンにあるように与えられた
Date
を変換しますGMT
DateTime
セルのタイムゾーンの変更を無効にします。
これらの手順は完全にはクリーンではありませんが、CETおよびCESTの日付に有効です。
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;
}
}
}
そして、そこの答えのためのファクトリメソッド
/** 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);
}
感謝ですが、問題はまだ表示されます:最終的なコードはここにある、私は日付を使用してコンストラクタで、私はDateTime.GMTを置く場合、時はGMT、私はDateTime.GMTを入れない場合はGMTです。 DateTimeはGMTのみを使用し、Timezoneは使用していないようです... – Enrico