2011-12-20 6 views
6

jxlでExcelシートを作成しようとしています。私のフィールドの 一つは日付で、私は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 (GMT) 解決方法を見つけようとしましたが、これが見つかりました http://www.andykhan.com/jexcelapi/tutorial.html#dates しかし、私はSimpleDateFormatをDateCellに渡すことはできません。 これを行う方法はありますか? 今、私はjava.util.Calendarを使って1時間を追加していますが、恐ろしい解決策です。 ありがとうございます!

答えて

2

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

デフォルトでは、システムのTimeZoneを使用して日付が変更されます。これを無効にするには、コンストラクタにjxl.write.DateTime.GMTDateオブジェクトを渡すことができます。使用するコードは次のとおりです。

WritableCell cell = null; 
cell = new jxl.write.DateTime(col, row, date, DateTime.GMT); 
+2

感謝ですが、問題はまだ表示されます:最終的なコードはここにある、私は日付を使用してコンストラクタで、私はDateTime.GMTを置く場合、時はGMT、私はDateTime.GMTを入れない場合はGMTです。 DateTimeはGMTのみを使用し、Timezoneは使用していないようです... – Enrico

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タイムゾーンを除いて、もう1時間ほど時間を動かすCEST(中央ヨーロッパ夏時間)です。 CEST時間で日付を使用しようとしたとき、予想ベースに1時間が追加されたため、再び機能しませんでした。私はのための "CET"の代わりに "CEST"タイムゾーンを設定する解決策だろうと思うが、私はCalendarから適切なタイムゾーンを取得する方法を把握しなかった、それは常にCETを返した。

とにかく、私は最終的には良くないが、信頼性の高い解決策を使用しました。私はその方法で

  • 1つの場所の設定を持つように日付セルのためのファクトリメソッドを持って

    • 、私はにタイムゾーンの形式を設定する最初の
    • でGMTタイムゾーンにあるように与えられたDateを変換します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); 
    } 
    
  • +0

    Excel/JXLはファイルごとに限られた量のセルフォーマットしか許さないので、あなたの 'createDate()'コードは概念的に間違っています。そのようなコードは、いくらかの量の細胞が加えられた後に失敗するでしょう。代わりに、毎回新しいフォーマットを作成するのではなく、一連のフォーマットを事前に作成して使用する必要があります。 –

    +0

    @PavelVlasov私はこれが「概念的に間違っている」とは思わないが、私はその制限を知らなかった。投稿の編集を自由に提案してください。私はそれらをマージすることがうれしいです。 – Gaim

    関連する問題