我尝试用jxl创建一个Excel工作表。我的一个字段是Date,我生活在GMT+1时区
我用这样的东西来做:
WritableCellFormat EXCEL_DATE_FORMATTER = new WritableCellFormat(new DateFormat("dd/MM/yyyy hh:mm"));
...
WritableCell cell = null;
cell = new jxl.write.DateTime(col, row, date);
cell.setCellFormat(EXCEL_DATE_FORMATTER);
日期以正确的格式写入,但具有-1小时值(GMT)我试图找到一个解决方案,我发现了这个http://www.andykhan.com/jexcelapi/tutorial.html#dates但是我不能将SimpleDateFormat传递给DateCell。有办法吗?现在我使用java.util.Calendar来添加一个小时,但这是一个糟糕的解决方案。谢谢你的帮助!
jxl.write.DateTime类有几个构造函数(参见API)。
默认情况下,它将使用您的系统时区来修改日期。您可以向构造函数传递jxl.write.DateTime.GMTDate对象来禁用此功能。下面是你应该使用的代码:
WritableCell cell = null;
cell = new jxl.write.DateTime(col, row, date, DateTime.GMT);
昨天我遇到了同样的问题。我生活在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 );
}