昨日、私は同じ問題を抱えていました。私は 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 タイムゾーン以外にも、CEST (中央ヨーロッパ夏時間) があり、時間が約 1 時間ずれます。CEST 時間で日付を使用しようとしたとき、予想されるベースに 1 時間が追加されたため、再び機能しませんでした。「CET」ではなく「CEST」タイムゾーンを設定するのが解決策だと思いますが、から適切なタイムゾーンを取得する方法がわかりませんでしたCalendar
。常にCETが返されました。
とにかく、最終的にはうまくいきませんが、確実に機能するソリューションを使用しました。
- 日付セルを1か所で構成するファクトリメソッドがあります
Date
その方法では、最初に与えられたものをGMTタイムゾーンに変換します
- タイムゾーン形式を 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 );
}