6

jxlでExcelシートを作成しようとしています。私のフィールドの 1 つは日付で、GMT+1 TimeZone に住んでいます

私はそれを行うために次のようなものを使用します:

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 を使用して 1 時間を追加していますが、これは恐ろしい解決策です。助けてくれてありがとう!

4

2 に答える 2

2

jxl.write.DateTime クラスにはいくつかのコンストラクターがあります ( API を参照)。

デフォルトでは、システムの TimeZone を使用して日付を変更します。コンストラクターに 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セルの作成で時間が約 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 );
}
于 2012-09-16T07:00:18.797 に答える