6

我尝试用 jxl 创建一个 Excel 工作表。我的一个领域是日期,我住在 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 小时(格林威治标准时间) 我试图找到一个解决方案,我找到了这个 http://www.andykhan.com/jexcelapi/tutorial.html#dates 但我可以' t 将 SimpleDateFormat 传递给 DateCell。有办法吗?现在我使用 java.util.Calendar 添加一个小时,但这是一个可怕的解决方案。感谢您的帮助!

4

2 回答 2

2

jxl.write.DateTime 类有几个构造函数(参见API)。

默认情况下,它将使用您的系统时区来修改日期。您可以将 jxl.write.DateTime.GMTDate 对象传递给构造函数来禁用它。这是您应该使用的代码:

WritableCell cell = null;
cell = new jxl.write.DateTime(col, row, date, DateTime.GMT);
于 2012-02-27T16:44:57.150 回答
1

昨天我有同样的问题。我住在 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 );
}
于 2012-09-16T07:00:18.797 回答