لماذا 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 يناير 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.

هل كانت مفيدة؟

المحلول

ما هو إصدار جافا الذي تستخدمه وعلى ما 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، وذلك باستخدام صن جافا 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. تغيير التعليمات البرمجية لاستخدام كائن التقويم الثاني للتاريخ الثاني:

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.

ملحوظة: حذار أن الحرفية صحيح أن تبدأ مع 0، مثل 0000 في التعليمات البرمجية الخاصة بك، سيتم تفسير كأرقام ثماني من قبل مترجم جافا. هذا لا يهم في هذه الحالة لأن الرقم 0، ولكن يجب أن لا أرفقت صحيح الحرفية مع أصفار إذا لم يكن يعني لهم كأرقام ثماني.

نصائح أخرى

وكان هناك التقويم الميلادي حتى 1582. وكان التقويم اليولياني في استخدام في جميع أنحاء أوروبا، حتى بدأت المشاكل قاصر لتظهر الناجمة عن حقيقة السنة الشمسية ليست بالضبط 365.25 يوما، ولكن قليلا أقل من ذلك. من أجل أشياء الإصلاح، أمر البابا غريغوري الثالث عشر لتغيير التقويم لما نعرفه اليوم - كل عام أن الانقسامات التي كتبها 100 ليست سنة كبيسة، ما لم يقسم على 400. في أكتوبر 1582 كان هناك انتقال - بعد يوم واحد 4 وكان 15 أكتوبر اكتوبر من هذا الوسائل التي حتى أكتوبر 1582، والتقاويم الميلادي وجوليان هي نفسها. يمكنك قراءة المزيد حول هذا الموضوع هنا

وهذا هو السبب في مواعيد مسبقة لأكتوبر 1582 يتم تحويلها إلى استخدام نظام الجولياني. وفقا ل API إذا كنت فعلا الحاجة لتمثيل حدثا تاريخيا (والذي لا يبدو عليه الحال هنا) يمكنك أن تفعل ذلك فقط من مسيرة 1ST، 4AD

وThhere ليس عام 0 في التقويم اليولياني. وغني عن الفترة من 1 إلى 1 قبل الميلاد AD.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top