2

日付値をデフォルト値の PreparedStatement に設定しようとしましたが、値が JulianValue として返されることがあります。例 (spanBegin と spanEnd が null であると仮定)

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 では、0000 年 1 月 1 日の日付がユリウス暦によってスコープされるため、CDate はユリウス暦になります。ただし、次の Date が 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 に設定される場合があることがわかります。

4

3 に答える 3

2

1582 年までグレゴリオ暦はありませんでした。ユリウス暦はヨーロッパ中で使用されていましたが、太陽年が正確には 365.25 日ではなく、それより少し短いという事実に起因する小さな問題が発生し始めました。物事を修正するために、教皇グレゴリウス 13 世は、カレンダーを今日私たちが知っているものに変更するよう命じました.100 で割る年は、400 で割らない限り、うるう年ではありません. 10 月は 10 月 15 日でした。これは、1582 年 10 月まで、グレゴリオ暦とユリウス暦が同じであることを意味します。詳細については、こちらをご覧ください。

これが、1582 年 10 月より前の日付がユリウス システムを使用するように変換される理由です。APIによると、実際に歴史的な出来事を表現する必要がある場合(ここではそうではないようです)、1st March、4ADからのみ行うことができます

于 2009-10-08T07:51:24.440 に答える
1

使用している 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);

出力 (Windows XP では、Sun Java 1.6.0_16 を使用):

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

0 年を 1 年に変更します。2 番目の日付に 2 番目の Calendar オブジェクトを使用するようにコードを変更します。

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);

Dateこれにより、2 つのオブジェクトの出力または内容が変更されることはありません。

注: コード内など、0 で始まる整数リテラルは0000、Java コンパイラによって 8 進数として解釈されることに注意してください。この場合は数値が 0 であるため問題ありませんが、整数リテラルを 8 進数として意味しない場合は、整数リテラルの前にゼロを追加しないでください。

于 2009-10-08T08:02:11.190 に答える
1

ユリウス暦には 0 年はありません。紀元前1年から西暦1年までです。

于 2009-10-08T15:44:51.173 に答える