public static Date convertJavaDate(final double numValue, final boolean startDate1904) {
        
        double utcDay;
        if(startDate1904) {
            // 1904年始まりの場合
            
            // UTC(1970年基準に戻す)
            utcDay = numValue + OFFSET_DAYS_1904;
            
        } else {
            // 1900年始まりの場合
            
            // UTC(1970年基準に戻す)
            utcDay = numValue + OFFSET_DAYS_1900;
            
            /*
             * 1900年3月1日（Excel上は1900年2月29日）以降の場合の補正。
             * ・Excel上は1900年は、閏年扱いで1900年2月29日の閏年が存在する。
             * ・しかし、グレゴリオ歴上は1900年は閏年ではないため、UTCの表現上から見ると1日多い。
             * ・1900年2月29日は、1900年1月0日から数えて61日目なので、61日以降は、1日前に戻す。
             */
            if(numValue >= NON_LEAP_DAY) {
                utcDay -= 1;
            }
            
        }
        
        /*
         * Javaのミリ秒に直す。
         * ・Excelの日付の形式の場合小数部が時間を示すため、24時間分のミリ秒を考慮する。
         */
        long utcTime = Math.round(utcDay * SECONDS_IN_DAYS) * 1000;
        return new Date(utcTime);
        
    }
public static Date convertJavaDate ( final double numValue , final boolean startDate1904 ) { double utcDay ; if ( startDate1904 ) { utcDay = numValue + OFFSET_DAYS_1904 ; } else { utcDay = numValue + OFFSET_DAYS_1900 ; if ( numValue >= NON_LEAP_DAY ) { utcDay -= 1 ; } } long utcTime = Math . round ( utcDay * SECONDS_IN_DAYS ) * 1000 ; return new Date ( utcTime ) ; }
Excel表現上の数値をJavaの{@link Date}型(UTC形式)に変換する。
<p>1900年始まりの場合は以下の注意が必要。</p>
<ul>
<li>値{@literal 0.0}は、Excel上は1900年1月0日であるが、Date型へ変換した場合は1899年12月31日となります。</li>
<li>値{@literal 60.0}は、Excel上は1900年2月29日だが、グレゴリオ歴上は閏日ではあにため、1900年3月1日となります。</li>
</ul>

@param numValue 変換対象のExcel表現上の数値。
@param startDate1904 基準日が1904年始まりかどうか。
@return Java表現上に変換した日時。
ただし、この値はタイムゾーンは考慮されていない（=GMT-00:00）ため、
変換後は独自に処理を行う必要があります。