なぜGregorianCalendar.getInstanceはcalsysとタイプユリウス暦のCDATEを含みません

StackOverflow https://stackoverflow.com/questions/1536148

質問

私は、デフォルト値でのPreparedStatementに設定された日付値を実行しようとしましたが、値は時々JulianValueとして返されます。例えば、(spanBeginとspanEndがヌルであると仮定する)

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

行番号3で、1月1日、0000はユリウス暦でスコープされた日付以降に、CDate関数は、ユリウス暦になります。しかし、次の日は、それが9999年にあっても、そのCDate関数は、まだユリウス暦になります。私は問題を解決するためにグレゴリオ暦の別のインスタンスを作成する必要がありました。

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

Calendar cal = new GregorianCalendar();
if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

質問は、これは予想される動作または日付オブジェクト上のバグですか?実際GregorianCalendar.getInstance()を使用してCDATEが時々JulianCalendarに設定されていることを示している。

役に立ちましたか?

解決

のJavaのバージョンは何あなたはどのようなOS上で使用していますか?あなたは本当に何年0と9999に日付を格納する必要がありますか、またはあなただけの「負の無限大」と「正の無限大」の値としてこれらを使用していますか?どのように正確にあなたのカレンダーはユリウス暦であることがわかりますか?

私はこれを試してみました。

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

cal.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal.getTime();

System.out.println(d1);
System.out.println(d2);

(のSun Java 1.6.0_16を使用して、Windows XP、上の)出力:

Thu Jan 01 09:53:56 CET 1 java.util.Date
Tue Dec 31 09:53:56 CET 9999 java.util.Date

これは、第二日のために二Calendarオブジェクトを使用するようにコードを変更する年1に年0を変更します:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

Calendar cal2 = Calendar.getInstance();
cal2.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal2.getTime();

System.out.println(d1);
System.out.println(d2);

この出力または2つのDateオブジェクトの内容には何も変わりません。

注:このようにコードで0000として、0で始まる整数リテラルを用心、Javaコンパイラによって8進数として解釈されます。数が0であるため、すなわち、この場合には重要ではありませんが、あなたは8進数としてそれらを意味するものではありません場合は、ゼロで整数リテラルを付加してはいけません。

他のヒント

マイナーな問題は、太陽年に起因出現し始めるまで、

何のグレゴリオ暦は1582年までなかったユリウス暦では、ヨーロッパ全土に使用されていた正確に365.25日ではありませんが、それよりも少し小さいです。物事を解決するためには、ローマ教皇グレゴリウス13は、我々が今日知っているものにカレンダーを変更するよう命じ - 100で割り、すべての年がうるう年ではありません、それは1582年10月には400によって分割されない限り、遷移があった - 4の翌日は、 10月には、これは1582年10月まで、グレゴリオ暦とユリウス暦が同じであることを意味10月15日でした。あなたはそれここ

についての詳細を読むことができます 1582年10月より前の日付はユリウスシステムを使用するために変換されている理由

このです。 API にあなたが実際に必要とする場合によると、 (ここではケースではないように思われる)歴史的な出来事を表現するためにあなただけの3月1日から、それを行うことができ、4AD

Thhereはユリウス暦には年間0ではありません。これは、1つのADに1つのBCから行きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top