2016-06-27 3 views
2

私は、1920年9月4日の日付の値を含むセルをExcelシートに入れ、アプリケーションに解析して使用します。 Excelシートから抽出するとうまく動作しますが、日付が正しく変換されません。興味深いのは、datevalueを含むセルをExcelシートから抽出すると、dateformatなどが返されず、代わりにdouble値が返されるということです。Excelの入力からJavaの日付

私は、有効なDateオブジェクトにこのdouble値(7552.0)に変換する必要がありますが、私はこれを適切に行うように見えることはできません、これは私がこれまでに得ているという最も近い:

new SimpleDateFormat("D").parse(getDateFromExcelAsString()) 

getDateFromExcelAsString()この方法は、文字列に二重に変換:

String.valueOf(dateAsDouble.intValue()) 

問題は、この方法は、現在までに7552.0 double値を変換していることである:9月4日、1990年しかし、これは1920年9月3日

する必要があります0

答えて

1

異なる参照を使用しているという問題があります。 excel day 0は31/Dec/1899で、Dateクラスでは0は1970年1月1日で、その値は70年ずれます。

私のようなシンプルで醜いソリューションテストしてみた:

double value = 7552; 
Date date = new Date(0); 
Calendar cal = new GregorianCalendar(); 
cal.setTime(date); 
cal.add(Calendar.DATE, (int) value - 25569); 
System.out.println(new SimpleDateFormat("d MMMM yyyy").format(cal.getTime())); 

を、コンソール出力が期待されている:あなたが解析してSimpleDateFormatを使用しているあなたの質問にあるので :

3 September 1920 

EDITここでは、そのアプローチ(カレンダーではなく)を使用してクイックで清潔でないソリューションを追加します。

double value = 7552; 
SimpleDateFormat inputFormat = new SimpleDateFormat("D"); 
Date date = inputFormat.parse("" + (value - 25568)); 
SimpleDateFormat outputFormat = new SimpleDateFormat("d MMMM yyyy"); 
System.out.println(outputFormat.format(date)); 

もう一度出力をコンソールがある:今オフセット日のSimpleDateFormat 1日0として25568で

3 September 1920 

注31/DEC/1969です。

+0

あなたの解決策が正しく理解されている場合は、javaの日付(つまり日の数が25569)から70年を差し引いて、日付の解釈をExcelで行う方法でフォーマットの違いを補うことをお勧めします。 ? – Ben

+0

これはすばらしい回避策のように聞こえますが、あまりクリーンではありません。言いましたが、すぐに解決できるので、答えをいただき、ありがとうございます。この回避策は一時的に機能するためです。 – Ben

+0

はい、実際にはハックのある回避策です。私はそれについて考えていましたが、オフセットを減算する以外の方法はありませんでした。私はSimpleDateFormatを使って解決策を追加しました。 – Julian

関連する問題