昨天我有同样的问题。我住在 CET 时区(中欧时间),简单创建DateTime
单元格将时间移动了大约一小时。
起初我尝试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(中欧夏令时)将时间移动了大约一个小时。当我尝试在 CEST 时间使用日期时,它没有再次起作用,因为在预期的基础上增加了一小时。我想为他们设置“CEST”时区而不是“CET”将是解决方案,但我不知道如何从 中获取正确的时区Calendar
,它总是返回 CET。
无论如何,最后我使用了一个不好但可靠的工作解决方案。
- 我有一个日期单元格的工厂方法,可以在一个地方进行配置
- 在那种方法中,我
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 );
}