الجزء الأول مقدمة
تعريف التقويم:
تقويم الطبقة التجريدية العامة ينفذ قابلة للتسلسل ، قابلة للاستنساخ ، قابلة للمقارنة <Calendar> {} يمكن اعتبار التقويم فئة مجردة.
يعتمد تنفيذها طريقة المصنع في نمط التصميم. يتجلى في: عندما نحصل على مثيل التقويم ، سيعيد التقويم كائن التقويم المقابل بناءً على المعلمات التي تم تمريرها. هناك طريقتان للحصول على مثيل تقويمي:
(1) عندما نحصل على التقويم من خلال التقويم.
Gregoriancalendar هو فئة تنفيذ من التقويم الذي يوفر نظام تقويم قياسي يستخدم في معظم البلدان في العالم.
(2) عندما نحصل على التقويم من خلال Calendar.getInstance (TimeZone Timezone ، Locale Locale) أو Calendar.GetInstance (TimeZone Timezone) أو Calendar.GetInstance (locale locale) ، فإنه يعيد "التقويم المستخدمة في المنطقة الزمنية المقابلة (المنطقة) أو المنطقة (المحلية) ، إلخ.".
على سبيل المثال ، إذا كانت اليابان ، يتم إرجاع الكائن الياباني.
الرجوع إلى الكود التالي:
التقويم الثابت العام getInstance () {// call createCalendar () لإنشاء تقويم تقويمي = createCalendar (timezone.getDefaultRef () ، locale.getDefault ()) ؛ cal.sharedzone = صحيح ؛ إرجاع cal ؛} التقويم الثابت العام getInstance (منطقة الزمن) {// call createCalendar () لإنشاء التقويم الإرجاع createCalendar (Zone ، locale.getDefault ()) أبرام) ؛ cal.sharedzone = صحيح ؛ return cal ؛} التقويم الثابت العام getInstance (منطقة المنطقة الزمنية ، alocale المحلية) {// call createCalendar () لإنشاء التقويم الإرجاع CreateCalendar (المنطقة ، alocale) ؛} هو "jp" ، فهو يعيد الكائن الياباني emperialcalendar إذا ("th" .equals (alocale.getlanguage ()) && ("th" .equals (alocale.getCountry ()))) } آخر إذا ("jp" .equals (alocale.getVariant ()) && "jp" .equals (alocale.getCountry ()))) } // (03) خلاف ذلك ، إرجاع كائن GregorianCalendar. إرجاع Gregoriancalendar الجديد (Zone ، Alocale) ؛ }بعد أن نحصل على مثيل التقويم ، يمكننا معالجة التقويم من خلال بعض أساليب الأعمدة التي توفرها التقويم.
الجزء 2 مبادئ وأفكار التقويم
عندما نستخدم التقويم ، نحن لسنا أكثر من تشغيل حقول التقويم "العام والشهر واليوم والأسبوع والساعة والدقيقة والثانية". أدناه ، نتعلم المصدر والتعريف وحساب طرق هذه الحقول.
1. التقويم مصدر كل قيمة حقل
عندما نستخدم التقويم ، نستخدم ببساطة معلومات مثل "السنة والشهر واليوم والساعة والدقيقة والثانية". فكيف فعلت ذلك؟ في الأساس ، يوفر التقويم الوقت. التعريف التالي:
// الوقت هو الوقت الحالي ، بالمللي ثانية. // هذا هو الفرق بين المسافة الزمنية الحالية "1 يناير 1970 ، 0:00:00 بتوقيت جرينتش". محمي وقت طويل ؛
يحسب التقويم معلومات مثل "سنة التقويم والشهر واليوم والساعة ، الدقيقة ، الثانية" على أساس الوقت.
2. تعريف وتهيئة كل مجال من مجال التقويم
تحتوي معلومات التقويم "العام والشهر واليوم والأسبوع والساعة والدقيقة والثانية" على 17 حقلًا.
نستخدم التقويم ، وهو ليس أكثر من هذه الحقول الـ 17. تعاريفهم كما يلي:
(الحقل 0) عصر int النهائي العام = 0 ؛
الوصف: عصر.
القيمة: لا يمكن أن تكون إلا 0 أو 1. 0 تعني قبل الميلاد ("قبل المسيح" ، أي قبل الميلاد) ، 1 يعني AD (اللاتينية "Anno Domini" ، أي ، م).
(الحقل 1) السنة الثابتة النهائية العام = 1 ؛
الوصف: السنة.
(الحقل 2) الشهر العام النهائي الثابت = 2 ؛
الوصف: القيمة الشهرية: يمكن أن يكون شهر يناير ، فبراير ، مارس ، أبريل ، مايو ، يونيو ، يوليو ، أغسطس ، سبتمبر ، أكتوبر ، نوفمبر ، ديسمبر ، undecimber.
الشهر الأول من هذا هو يناير ، وهو 0.
(الحقل 3) Final Static int week_of_year = 3 ؛
ملاحظة: التاريخ الحالي يتوافق مع أسبوع العام. القيمة للأسبوع الأول من العام هي 1.
(الحقل 4) النهائي العام الثابت int week_of_month = 4 ؛
ملاحظة: التاريخ الحالي يتوافق مع أسبوع الشهر. القيمة للأسبوع الأول من الشهر هي 1.
(الحقل 5) تاريخ int النهائي العام = 5 ؛
الوصف: اليوم. القيمة لليوم الأول من الشهر هي 1.
(الحقل 5) النهائي العام الثابت int day_of_month = 5 ؛
ملاحظة: مثل "التاريخ" ، يعني "اليوم".
(الحقل 6) ثابت عام ثابت int day_of_year = 6 ؛
ملاحظة: ما هو اليوم الذي يتوافق فيه التاريخ الحالي مع هذا العام؟ القيمة لليوم الأول من العام هي 1.
(الحقل 7) النهائي العام الثابت int day_of_week = 7 ؛
الوصف: في أي يوم من يوم الأسبوع.
القيم: يمكن أن يكون الأحد ، الاثنين ، الثلاثاء ، الأربعاء ، الخميس ، الجمعة والسبت.
من بينهم ، الأحد 1 ، الاثنين هو 2 ، وهلم جرا.
(الحقل 8) ثابت عام ثابت int day_of_week_in_month = 8 ؛
الوصف: ما هو أسبوع الشهر الحالي.
القيم: day_of_month 1 إلى 7 تتوافق دائمًا مع day_of_week_in_month 1 ؛ 8 إلى 14 تتوافق دائمًا مع day_of_week_in_month 2 ، وهكذا.
(الحقل 9) النهائي العام الثابت int am_pm = 9 ؛
الوصف: القيمة الصباحية أو بعد الظهر: يمكن أن تكون AM أو PM. أنا 0 ، يشير إلى الصباح. PM هو 1 ، يشير بعد الظهر.
(الحقل 10) ساعة ثابتة عامة ثابتة = 10 ؛
الوصف: يشير إلى ساعة اليوم.
يتم استخدام ساعة لمدة 12 ساعة (0 - 11). يتم تمثيل الظهر ووسط الليل 0 ، وليس 12.
(الحقل 11) Final Final Static int Hour_of_day = 11 ؛
الوصف: يشير إلى ساعة اليوم.
يتم استخدام hour_of_day لمدة 24 ساعة. على سبيل المثال ، في لحظة 10: 04: 15.250 مساءً ، hour_of_day هو 22.
(الحقل 12) الدقيقة الثابتة العامة الثابتة = 12 ؛
الوصف: أي دقيقة من الساعة؟
على سبيل المثال ، في لحظة 10: 04: 15.250 مساءً ، الدقيقة 4.
(Field 13) Public Final Static Int Second = 13 ؛
الوصف: ما الثاني في الدقيقة.
على سبيل المثال ، في لحظة 10: 04: 15.250 مساءً ، الثانية هي 15.
(الحقل 14) النهائي العام الثابت int millisecond = 14 ؛
الوصف: ما ميلي ثانية من الثانية.
على سبيل المثال ، في لحظة 10: 04: 15.250 مساءً ، يبلغ عدد المللي ثانية 250.
(الحقل 15) Final Static int Zone_Offset = 15 ؛
ملاحظة: تشير المللي ثانية إلى الإزاحة التقريبية من GMT.
(الحقل 16) Public Final Static Int DST_OFFSET = 16 ؛
الوصف: تشير المللي ثانية إلى إزاحة وقت توفير ضوء النهار.
ثابت عام ثابت int field_count = 17 ؛
يتم حفظ هذه الحقول الـ 17 في صفيف Int. التعريف كما يلي:
// حفظ صفيف هذه الحقول الـ 17 المحمية المحمية [] ؛ // وظيفة تعريف تعريف الصفيف المحمية (منطقة المنطقة الزمنية ، alocale المحلية) {// تهيئة "الحقول الصفيف" الحقول = new int [field_count] ؛ ISSET = جديد منطقي [field_count] ؛ Stamp = new int [field_count] ؛ this.Zone = Zone ؛ setweekcountdata (alocale) ؛}التقويم المحمي (منطقة الزمن ، alocale المحلية) هذا هو مُنشئ التقويم. سيطلق عليه مُنشئ الفئات الفرعية ، وبالتالي إنشاء مجموعة جديدة من "حفظ 17 بيانات حقل للتقويم".
3. التقويم التقويم حساب كل قيمة حقل
دعنا نأخذ GET (حقل int) كمثال لشرح حساب الحقول الـ 17 للتقويم وتشغيلها بإيجاز. الحصول على (حقل int) هو الحصول على قيمة حقل "الحقل". تعريفه كما يلي:
public int get (int field) {// قم بحساب قيم كل حقل كاملة () ؛ // إرجاع قيمة حقل الحقل إرجاع internalget (الحقل) ؛} ملاحظة: رمز GET (حقل int) بسيط للغاية. أولاً ، احسب قيم كل حقل من خلال Complete () ، ثم إرجاع "قيمة حقل الحقل" من خلال Internalget (الحقل).
وظيفة كاملة () هي حساب قيم كل حقل من التقويم. يتم تعريفه في Calendar.java ، الرمز كما يلي:
void complete complete () {if (! iStimeset) updateTime () ؛ if (! arefieldsset ||! areallfieldsset) {computefields () ؛ // يملأ حقول areallfieldsset areallfieldsset = arefieldsset = صواب ؛ }} private void updateTime () {computetime () ؛ iStimeset = true ؛} updateTime () يتم تعريف الحوسبة () التي تسمى في فئة تنفيذ Calendar.java. أدناه ، أدرج تطبيق Computetime () في gregoriancalendar.java: computetime void المحمي () {// في الوضع غير المدمر ، قم بإجراء فحص موجز لحقول التقويم // التي تم تعيينها خارجيًا. من خلال هذا // التحقق ، يتم تخزين قيم الحقل في Fields OriginalFields [] // لمعرفة ما إذا كان يتم تطبيع أي منها لاحقًا. if (! isLenient ()) {if (OriginalFields == null) {OriginalFields = new int [field_count] ؛ } لـ (int field = 0 ؛ field <field_count ؛ field ++) {int value = internalget (field) ؛ if (isexternallyset (field)) {// التحقق السريع لأي قيم خارج النطاق إذا (القيمة <getMinimum (field) || value> getMaximum (field)) {رمي جديد غير intervaliTexception (getFileName (field)) ؛ }} OriginalFields [field] = value ؛ }} // دع الفئة الفائقة تحدد حقول التقويم التي يجب استخدامها // لحساب الوقت. int fieldmask = selectfields () ؛ // الافتراضيات للعام إلى بدء الحقبة. لا نتحقق // Fieldmask للعام لأن السنة هي حقل إلزامي إلى // تحديد التاريخ. int year = isset (year)؟ internalget (سنة): epoch_year ؛ int era = internalgetera () ؛ if (era == bce) {year = 1 - year ؛ } آخر إذا (عصر! = CE) {// حتى في وضع التساهل ، فإننا ننفذ قيم عصر بخلاف CE & BCE. // (نفس قاعدة التطبيع مثل Add ()/roll () يمكن تطبيقها هنا في الوضع المتساهل. ولكن يتم الحفاظ على هذا الفحص // دون تغيير للتوافق اعتبارًا من 1.5.) رمي جديد غير شرعي ("عصر غير صالح") ؛ } // إذا كانت السنة 0 أو سلبية ، فنحن بحاجة إلى ضبط قيمة الحقبة لاحقًا. if (year <= 0 &&! isset (era)) {fieldmask | = era_mask ؛ setFieldsComped (era_mask) ؛ } // حساب الوقت من اليوم. نحن نعتمد على الاتفاقية التي // حقل غير محدد لديه 0. if (isfieldset (fieldmask ، hour_of_day)) {timeofday += (long) internalget (hour_of_day) ؛ } آخر {timeofday += internalget (ساعة) ؛ // القيمة الافتراضية لـ AM_PM هي 0 التي تحدد AM. if (isfieldset (fieldmask ، am_pm)) {timeOfday += 12 * internalget (am_pm) ؛ }} timeofday *= 60 ؛ TimeOfday += InternalGet (دقيقة) ؛ TimeOfday *= 60 ؛ TimeOfday += InternalGet (الثانية) ؛ TimeOfday *= 1000 ؛ TimeOfday += InternalGet (millisecond) ؛ // تحويل الوقت من اليوم إلى عدد الأيام و // millisecond الإزاحة من منتصف الليل. long fixedDate = timeOfday / One_day ؛ TimeOfday ٪ = One_day ؛ بينما (TimeOfday <0) {timeOfday += One_day ؛ -FixedDate ؛ } // حساب التاريخ الثابت منذ 1 يناير 1 (غريغوريان). calculateFixedDate: {long gfd ، jfd ؛ if (year> gregoriancutoveryear && year> gregoriancutoveryearjulian) {gfd = fixeddate + getFixedDate (gcal ، year ، fieldmask) ؛ if (gfd> = gregoriancutoverdate) {fixedDate = gfd ؛ كسر calcutedfixeddate. } jfd = ثابت + getFixedDate (getjuliancalendarsystem () ، السنة ، fieldmask) ؛ } آخر إذا (السنة <gregoriancutoveryear && year <gregoriancutoveryearjulian) {jfd = fixeddate + getFixedDate (getjuliancalendarsystem () ، year ، fieldmask) ؛ if (jfd <gregoriancutoverdate) {fixedDate = jfd ؛ كسر calcutedfixeddate. } gfd = fixedDate + getFixedDate (gcal ، year ، fieldmask) ؛ } else {gfd = fixedDate + getFixedDate (gcal ، year ، fieldmask) ؛ JFD = ثابت + getFixedDate (getjuliancalendarsystem () ، السنة ، الميدان) ؛ } // الآن علينا تحديد تاريخ التقويم. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {flexDate = gfd ؛ } آخر {// التاريخ في فترة "متداخلة". بأي حال من الأحوال // لعرضها. تحديد ذلك باستخدام حساب التاريخ السابق. if (calsys == gcal || calsys == null) {sediledDate = gfd ؛ } else {flexDate = jfd ؛ }}} آخر {if (jfd <gregorianCutoverDate) {fixedDate = jfd ؛ } آخر {// التاريخ في فترة "مفقودة". if (! isLenient ()) {رمي جديد غير unalfalArgumentException ("التاريخ المحدد غير موجود") ؛ } // خذ تاريخ جوليان للتوافق ، الذي سيؤدي // إلى إنتاج تاريخ غريغوري. ثابت = JFD ؛ }}} // millis يمثل وقت الحائط المحلي بالمللي ثانية. millis long = (ثابت - epoch_offset) * one_day + timeOfday ؛ // حساب إزاحة المنطقة الزمنية وإزاحة DST. هناك نوعان من الغموض // هنا. سنفترض الساعة 2:00 صباحًا (وقت الجدار) وقت التبديل // لأغراض المناقشة هنا. // 1. الانتقال إلى DST. هنا ، يمكن أن يكون الوقت المصمم من الساعة 2:00 صباحًا - 2:59 صباحًا // في DST اعتمادًا. ومع ذلك ، 2:00 صباحًا هو تمثيل غير صالح // (يقفز التمثيل من 1:59:59 صباحًا إلى 3:00:00 صباحًا DST). // نفترض الوقت القياسي. // 2. الانتقال من DST. هنا ، يمكن أن يكون الوقت المصمم من الساعة 1:00 صباحًا - 1:59 صباحًا // في DST قياسيًا. كلاهما تمثيل صالح (القفز من REP // من 1:59:59 DST إلى 1:00:00 الأمراض المنقولة جنسياً). // مرة أخرى ، نفترض الوقت القياسي. // نستخدم كائن TimeZone ، ما لم يكن المستخدم قد قام بتعيين حقول Zone_Offset // أو DST_OFFSET بشكل صريح ؛ ثم نستخدم تلك الحقول. منطقة الزمن = getZone () ؛ if (ZoneOffSets == null) {ZoneOffSets = new int [2] ؛ } int tzmask = fieldmask & (Zone_offset_mask | dst_offset_mask) ؛ if (tzmask! = (Zone_offset_mask | dst_offset_mask)) {if (Zone intoryof ZoneInfo) {((ZoneInfo) Zone) .getOffSetsBywall (millis ، ZoneOffSets) ؛ } آخر {int gmtoffset = isfieldset (fieldmask ، Zone_Offset)؟ internalget (Zone_Offset): Zone.getRawoffset () ؛ Zone.GetOffSets (millis - gmtoffset ، ZoneOffSets) ؛ }} if (tzmask! = 0) {if (iSfieldSet (tzmask ، Zone_Offset)) {ZoneOffSets [0] = internalget (Zone_Offset) ؛ } if (isfieldset (tzmask ، dst_offset)) {ZoneOffSets [1] = internalget (dst_offset) ؛ }} // اضبط قيم إزاحة المنطقة الزمنية للحصول على وقت UTC. millis -= ZoneOffSets [0] + ZoneOffsets [1] ؛ // قم بتعيين وقت هذا التقويم في وقت مللي ثانية = ميليس ؛ int mask = computefields (fieldmask | getSetStateFields () ، tzmask) ؛ if (! isLenient ()) {for (int field = 0 ؛ field <field_count ؛ field ++) {if (! isexternalset (field)) {conter ؛ } if (OriginalFields [field]! = internalget (field)) {// استعادة قيم الحقل الأصلية system.arraycopy (OriginalFields ، 0 ، Fields ، 0 ، Fields.Length) ؛ رمي جديد غير unalfalargumentException (GetFieldName (Field)) ؛ }}} setfieldsnormized (قناع) ؛} بعد ذلك ، دعونا نلقي نظرة على تعريف InternalGet (الحقل). على النحو التالي:
النهائي المحمي int internalget (Int Field) {Return Fields [Field] ؛} من هذا يمكننا أن نرى أن الحصول على (حقل int) في نهاية المطاف يعيد القيمة من خلال Internalget (Int Field).
InternalGet (Int Field) تقوم بالفعل بإرجاع عنصر الحقل في صفيف الحقل. هذا يتوافق مع العناصر الـ 17 من التقويم!
باختصار ، ما نحتاج إلى فهمه هو: Calendar يحسب "السنة والشهر واليوم والدقيقة والثانية" وهكذا استنادًا إلى وقت (ميلي ثانية) ، وذلك لتسهيل عملياتنا على "السنة ، اليوم ، ساعة ، دقيقة ، ثانية". أدناه ، نقدم وظائف التشغيل ذات الصلة التي توفرها التقويم أدناه.
الجزء 3 واجهة وظيفة التقويم
1. الواجهة الشائعة لـ 17 حقول من التقويم
تدعم هذه الحقول الـ 17 من التقويم واجهة الوظيفة العامة التالية. للحصول على أمثلة على استخدام هذه الواجهات الشائعة ، يرجى الرجوع إلى وظيفة TestAllCalendarsections () في مثال CalendArtest.java.
(1) getMaximum (حقل int)
الوظيفة: احصل على "القيمة القصوى للحقل". لاحظ "قارن الفرق بينه وبين GetActualMaximum ()". مثال: من حيث حقل "الشهر". كيفية استخدامه هو:
// الحصول على تقويم مثيل Calendar cal = calendar.getInstance () ؛ // احصل على أقصى قيمة للشهر int max = cal.getMaximum (calendar.month) ؛
للحصول على أقصى قيمة للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(2) getActualMaximum (حقل int)
الوظيفة: احصل على "القيمة القصوى لهذا الحقل تحت التاريخ الحالي". مثال: من حيث حقل "الشهر". كيفية استخدامه هو:
// الحصول على تقويم مثيل Calendar Cal = Calendar.getInstance () ؛ // احصل على أقصى قيمة للشهر الحالي int max = cal.getActualMaximum (calendar.month) ؛
للحصول على أقصى قيمة للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
ملاحظة: قارن الفرق بين getActualMaximum () و getMaximum (). الرجوع إلى مثال المقارنة أدناه ،
A. تشير "القيمة القصوى للحقل" التي تم الحصول عليها بواسطة getMaximum () إلى "القيمة القصوى للحقل" التي تم الحصول عليها في جميع التواريخ مجتمعة.
على سبيل المثال ، الغرض من getMaximum (Calendar.date) هو "الحصول على" الحد الأقصى لليوم "". بناءً على جميع التواريخ ، يتم الحصول على 31 يومًا كحد أقصى في الشهر. لذلك ، فإن قيمة إرجاع getMaximum (Calendar.date) هي "31"!
B. GetActualMaximum () يحصل على "القيمة القصوى لهذا الحقل في التاريخ الحالي".
على سبيل المثال ، عندما يكون التاريخ هو 2013-09-01 ، فإن GetActualMaximum (Calendar.date) هو الحصول على "الحد الأقصى لليوم" وهو "30". التاريخ الحالي هو سبتمبر ، وسبتمبر 30 يومًا فقط. لذلك ، فإن قيمة إرجاع GetActualMaximum (Calendar.date) هي "30"!
(3) getMinimum (Int Field)
الوظيفة: احصل على "القيمة الدنيا للحقل". لاحظ "قارن الفرق بينه وبين GetActualMinimum ()". مثال: من حيث حقل "الشهر". كيفية استخدامه هو:
// الحصول على تقويم مثيل Calendar cal = calendar.getInstance () ؛ // احصل على الحد الأدنى لقيمة الشهر int min = cal.getMinimum (calendar.month) ؛
للحصول على الحد الأدنى لقيمة الحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(4) getActualMinimum (حقل int)
الوظيفة: احصل على "الحد الأدنى لقيمة هذا الحقل تحت التاريخ الحالي". مثال: من حيث حقل "الشهر". استخدام الطريقة: // الحصول على تقويم مثيل Calendar Cal = Calendar.getInstance () ؛ // احصل على الحد الأدنى لقيمة الشهر int min = cal.getMinimum (calendar.month) ؛
للحصول على الحد الأدنى لقيمة الحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
ملاحظة: في التقويم الافتراضي لجافا ، على الرغم من أن getMinimum () و getActualMinimum () لهما معاني مختلفة ؛ ومع ذلك ، فإن قيم عائدهم هي نفسها. لأن الافتراضي للتقويم هو إعادة كائن GregorianCalendar ، في GregorianCalendar.java ، getminimum () و getActualMinimum () إرجاع نفس القيمة.
(5) الحصول على (حقل int)
الوظيفة: احصل على "القيمة الحالية للحقل". يحصل على القيمة الحالية لحقل الحقل. مثال: من حيث حقل "الشهر". طريقة "الحصول على القيمة الحالية للشهر" هي:
// الحصول على تقويم مثيل Calendar Cal = Calendar.getInstance () ؛ // الحصول على القيمة الشهر الحالية لـ "Cal Calendar" int month = cal.get (Calendar.month) ؛
للحصول على القيمة الحالية للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(6) SET (حقل int ، قيمة int)
الوظيفة: اضبط "القيمة الحالية للحقل". قم بتعيين القيمة الحالية لحقل الحقل على مثال القيمة: من حيث حقل "الشهر". طريقة "تعيين القيمة الحالية للشهر" هي:
// الحصول على تقويم مثيل Calendar Cal = Calendar.getInstance () ؛ // قم بتعيين القيمة الشهر الحالية لـ "Cal Calendar" إلى 1988 Cal.Set (Calendar.mon ، 1988) ؛
يوضح:
A. 1988 هي القيمة الحالية للشهر الذي تريد ضبطه. يجب أن تكون قيمة الإعداد هذه عددًا صحيحًا.
ب. لتعيين القيمة الحالية للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(7) إضافة (حقل int ، قيمة int)
الوظيفة: أضف قيمة إلى "القيمة الحالية للحقل". أضف قيمة إلى القيمة الحالية لحقل الحقل. مثال: من حيث حقل "الشهر". الطريقة كما يلي:
// احصل على مثيل تقويمي وقم بتعيين تاريخ "2013-09-01" Calendar Cal = Calendar.getInstance () ؛ Cal.Set (Calendar.year ، 2013) ؛
يوضح:
A. -10 هي القيمة المضافة.
يمكن أن تكون القيمة المضافة رقمًا إيجابيًا أو سالبًا.
يشير العدد الإيجابي إلى زيادة التاريخ ، ويشير الرقم السلبي إلى انخفاض التاريخ.
الافتراض: الآن قيمة CAL هي "2013-09-01" ، والآن نزيد من قيمة حقل الشهر -10. والنتيجة هي: "2012-10-01".
لماذا هذا يحدث؟ "2013-09-01" يزيد -10 ، مما يعني تقليل التاريخ إلى الأمام بمقدار 10 أشهر ؛ والنتيجة هي "2012-10-01".
ب. من بين الحقول الـ 17 من التقويم: باستثناء التراجع عن التقويم الحقول الأخرى تدعم هذه العملية.
C. لتعيين القيمة الحالية للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(8) لفة (حقل int ، قيمة int)
الوظيفة: راجع "القيمة الحالية للحقل" مثال: خذ حقل "الشهر". طريقة "التراجع عن القيمة الحالية للشهر" هي:
// احصل على مثيل تقويمي وقم بتعيين تاريخ "2013-09-01" Calendar Cal = Calendar.getInstance () ؛ Cal.Set (Calendar.year ، 2013) ؛
يوضح:
A. -10 هي قيمة التراجع.
عندما تكون قيمة التراجع رقمًا سلبيًا ، فهذا يعني تدحرج الحقل الحالي للأمام ؛
عندما تكون قيمة التراجع رقمًا إيجابيًا ، فهذا يعني تدحرج الحقل الحالي للخلف.
عند التراجع عن حقل في التقويم ، لا تقم بتغيير الحقل الأكبر!
هذا هو الفرق الأساسي بين ROLL () و ADD ()! قد تؤدي إضافة () إلى تغيير الحقول الكبيرة ، مثل "استخدام ADD () لتعديل حقل" الشهر "، وقد يتسبب في حقل" العام "" ؛ لكن Roll () لن يغير الحقول الكبيرة ، مثل "استخدام Roll () لتعديل حقل" الشهر "، فلن يتسبب ذلك في حقل" العام "."
الافتراض: الآن قيمة CAL هي "2013-09-01" ، والآن نزيد من قيمة حقل الشهر -10. والنتيجة هي: "2013-10-01".
لماذا هذا يحدث؟ وذلك لأن "التراجع" يعني "التدحرج ذهابًا وإيابًا بين الحد الأدنى والحد الأقصى". في هذا المثال ، هو الشهر هو سبتمبر ، والتراجع السابق هو 10 ، والقيمة التي تم الحصول عليها هي أكتوبر ، لكن Roll () لن تغير الحقل "أكبر من شهر" ، وبالتالي فإن حقل السنة لن يتغير. وبالتالي فإن النتيجة هي "2013-10-01".
ب. من بين الحقول الـ 17 من التقويم: باستثناء التراجع عن التقويم الحقول الأخرى تدعم هذه العملية.
C. لتعيين القيمة الحالية للحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(9) واضح (حقل int)
الوظيفة: مسح "القيمة الحالية للحقل". ما يسمى المقاصة في الواقع يحدد قيمة "الحقل" إلى 0 ؛ إذا كان الحد الأدنى لقيمة الحقل 1 ، فسيتم تعيينه على 1. مثال: من حيث الحقل "الشهر". طريقة "الشهر الواضح" هي:
// احصل على مثيل تقويمي وقم بتعيين تاريخ "سبتمبر" Calendar Cal = Calendar.getInstance () ؛ Cal.Set (Calendar.mon ، 9) ؛ // Clear MonthCal.clear (Calendar.month) ؛
لمسح الحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
(10) إيسيت (حقل int)
الوظيفة: تحديد ما إذا كان "حقل الحقل" قد تم تعيينه. إذا تم استدعاء Clear () ، يصبح الحقل "بدون حالة محددة". مثال: من حيث حقل "الشهر". طريقة "الحكم سواء تم تعيين الشهر" هي:
// الحصول على تقويم مثيل Calendar cal = calendar.getInstance () ؛ // تحديد ما إذا كان الشهر قد تم تعيين BOSEN BSET = CAL.ISSET (CALENDAR.MONTH) ؛
لتحديد الحقول الأخرى ، تحتاج فقط إلى استبدال الشهر المقابل في المثال بأسماء الحقول الأخرى.
2. وظائف أخرى من التقويم
(1) وظيفة مقارنة التاريخ
تتضمن وظيفة مقارنة التقويم بشكل أساسي ما يلي:
// قارن ما إذا كانت التاريخ والمنطقة الزمنية والمحتوى الآخر من "كائن التقويم الحالي" و "التقويم" متساوون. المساواة في منطقية (كائن كائن) // ما إذا كان كائن التقويم الحالي هو في وقت مبكر من التقويم قبل (التقويم الكائن) // ما إذا كان الكائن التقويم الحالي هو متأخر عن التقويم بعد (كائن التقويم) // قارن "كائن التقويم الحالي" و "التقويم". // إذا كان ذلك قبل "التقويم" ، إرجاع -1 // إذا كان متساويًا ، فاحصل على 0 // إذا بعد ذلك من "Calendar" ، Return 1Int مقارنة (التقويم الآخر)
للحصول على أمثلة على استخدام هذه الوظائف ، يرجى الرجوع إلى وظيفة TestComparatorApis () في مثال CalendArtest.java.
مثال: افترض أن CAL1 و CAL2 هما كلا الموضوعين من التقويم.
// أساليب استخدامهم هي كما يلي isequal boolean = cal1.equals (cal2) ؛ boolean isBefore = cal1.beore (cal2) ؛ boolean isafter = cal1.after (cal2) ؛ int icompare = cal1.compareto (cal2) ؛
(2) وظيفة "التسامح"
// تعيين "التسامح التقويم" setlenient باطلة (قيمة منطقية) // الحصول على "التسامح التقويم" المنطقية Islenient ()
للحصول على أمثلة على استخدام هذه الوظائف ، يرجى الرجوع إلى وظيفة testlenientapis () في مثال Calendartest.java.
يوضح:
يحتوي التقويم على وضعين يفسران حقول التقويم ، وهما المتساهلين وغير المئوية.
أ. عندما يكون التقويم في وضع متسامح ، يمكن أن يقبل القيم ضمن نطاق أكبر من نطاق حقول التقويم التي يولدها. عندما يعيد التقويم حساب قيم حقل التقويم بحيث يتم إرجاع هذه القيم عن طريق GET () ، يتم تطبيع جميع حقول التقويم.
على سبيل المثال ، يفسر GregorianCalendar في الوضع المتساهل الشهر == يناير ، Day_of_month == 32 AS 1 فبراير.
ب. عندما يكون التقويم في الوضع غير المريح ، إذا كان هناك أي تناقض في مجال التقويم الخاص به ، فسوف يلقي استثناء.
على سبيل المثال ، يقوم GregorianCalendar دائمًا بإنشاء قيمة Day_of_month بين 1 وطول الشهر. إذا تم تعيين أي قيم حقل خارج النطاق ، فإن GregorianCalendar في وضع غير المتراجع يلقي استثناء عند حساب قيم حقل الوقت أو التقويم.
ملاحظة: لن يتم إلقاء الاستثناء في الخطوة (02) عند استخدام Set () ، ولكن سيتم إلقاؤه فقط في وظائف مثل GET () و GetTimeInMillis () و GetTime () و Add () و Roll (). نظرًا لأن Set () يضع فقط علامة تعديل ، وسيؤدي طرق مثل GET () إلى إعادة حساب الوقت ، وسيتم طرح استثناء في هذا الوقت!
(3) "السنة والشهر واليوم والمنطقة الزمنية ومللي ثانية
// مجموعة "سنة ، شهر ، يوم ،" مجموعة الفراغ النهائية (int year ، الشهر ، اليوم ، الوقت ، الوقت ، int الثاني) // مجموعة "السنة ، الشهر ، الوقت ، الوقت ، int الثاني) // مجموعة" السنة ، الشهر ، الوقت ، الدقيقة ، مجموعة الفراغ النهائية (تحديد تاريخ ، احصل على المنطقة الزمنية المقابلة للمنطقة الزمنية للتقويم getTimeZone () // قم بتعيين المنطقة الزمنية المقابلة للتقويم Void settimezone (الزمن الزمني للمنطقة الزمنية) // احصل على قيمة milliscondes المقابلة للتقويم ، وهو milliseconds من "تاريخ التقويم" من "1970-01 0:00:00:00 GMT" التقويم الفراغ settimeinmillis (مللي ثانية طويلة)
للحصول على أمثلة على استخدام هذه الوظائف ، يرجى الرجوع إلى وظيفة resttimeapis () في مثال Calendartest.java.
(4) العمليات الأخرى
// Clone CalendarObject Clone () // احصل على "ما هو يوم الأسبوع هو اليوم الأول من الأسبوع". على سبيل المثال ، في الولايات المتحدة ، هذا اليوم يوم الأحد ، وفي فرنسا ، هذا اليوم هو الاثنين. int getfirstdayofweek () // set "ما هو يوم الأسبوع هو اليوم الأول من الأسبوع". على سبيل المثال ، في الولايات المتحدة ، هذا اليوم يوم الأحد ، وفي فرنسا ، هذا اليوم هو الاثنين. void setfirstdayofweek (int value) // يحصل على الحد الأدنى لعدد الأيام المطلوبة للأسبوع الأول من العام. على سبيل المثال ، إذا كان الأسبوع الأول يحتوي على اليوم الأول من الشهر الأول من العام ، فسيتم إرجاع هذه الطريقة 1. إذا كان الحد الأدنى لعدد الأيام هو أسبوع كامل ، فإن هذه الطريقة تعود 7. أسبوع كامل ، يتم استدعاء هذه الطريقة بقيمة 7.
للحصول على أمثلة على استخدام هذه الوظائف ، يرجى الرجوع إلى وظيفة TestOtherApis () في مثال Calendartest.java.
الجزء 4 مثال استخدام التقويم
أدناه ، نتعلم واجهة برمجة التطبيقات باستخدام التقويم من خلال أمثلة. رمز المصدر للتقويم. جافا كما يلي:
استيراد java.util.date ؛ استيراد java.util.calendar ؛ استيراد java.util.timezone ؛ استيراد java.util.random ؛ تقويم الطبقة العامة {public static void main (string [] args) // اختبار التقويم "الواجهة المقارنة" testComparatorApis () ؛ // اختبار التقويم "الواجهة المقارنة" testlenientapis () ؛ // اختبار تقويم التقويم ، والمنطقة الزمنية ، والمللي ثانية وغيرها من الوظائف ذات الصلة testtimeapis () ؛ // اختبار التقويم Clone () ، getFirstdayOfWeek () والواجهات الأخرى TestOtherApis () ؛ } /** * اختبار "حقل التقويم" * * param cal - كائن تقويم * param حقل - "حقل التقويم" ليتم اختباره. يمكن أن تكون القيم التالية: * calendar.year ، calendar.month ، calendar.date ، ... etc * param title - title */ private static void testsection (Calendar cal ، int field ، string title) {final random random = new random () ؛ تاريخ التاريخ النهائي = cal.getTime () ؛ Final int min = cal.getMinimum (field) ؛ // احصل على "قيمة الحد الأدنى للحقل" النهائي int max = cal.getMaximum (الحقل) ؛ // احصل على "قيمة الحقل القصوى" النهائي int stualmin = cal.getActualMinimum (الحقل) ؛ // احصل على "الحد الأدنى لقيمة الحقل تحت التاريخ الحالي" النهائي int stualmax = cal.getActualMaximum (الحقل) ؛ // احصل على "القيمة القصوى للحقل تحت التاريخ الحالي" // احصل على "القيمة الحالية للحقل" النهائي int ori = cal.get (الحقل) ؛ // قم بتعيين "القيمة الحالية للحقل" واحصل على "القيمة بعد الإعداد" النهائي int r1 = random.nextint (Max) ؛ Cal.Set (الحقل ، R1) ؛ مجموعة int النهائية = cal.get (الحقل) ؛ جرب {// roll "القيمة الحالية للحقل": Roll Ret بين "الحد الأدنى لقيمة الحقل" و "القيمة القصوى للحقل". // يمكن أن تكون "قيمة الأسطوانة" إيجابية أو سلبية. Cal.Roll (Field ، -Max) ؛ } catch (alfulalArgumentException e) {// عندما يكون الحقل == calendar.zone_offset ، سيتم طرح الاستثناء! E.PrintStackTrace () ؛ } النهائي int لفة = cal.get (حقل) ؛ // احصل على قيمة عشوائية int علامة int = (Random.NextInt (2) == 1)؟ 1: -1 ؛ Final int r2 = sign * random.nextint (max) ؛ جرب {// إضافة "القيمة الحالية للحقل" واحصل على "قيمة الحقل الحالي الجديد" // يمكن أن تكون "قيمة المعلمة" من الإضافة موجبة أو سلبية. Cal.Add (Field ، R2) ؛ } catch (alfulalArgumentException e) {// عندما يكون الحقل == calendar.zone_offset ، سيتم طرح الاستثناء! E.PrintStackTrace () ؛ } int النهائي add = cal.get (حقل) ؛ // طباعة معلومات معلومات الحقل. } / ** * اختبار التقويم "واجهة الوظيفة العامة مع 17 حقل" * / private static void testAllCalendarSections () {// 00. ERA TestCeection (Calendar.getInstance () ، Calendar.era ، "Calendar.era") ؛ // 01. TESTCECTION YEAR (CALENDAR.GETINSTANCE () ، Calendar.year ، "Calendar.year") ؛ // 02 // 03. week_of_year field testSection (calendar.getInstance () ، calendar.week_of_year ، "calendar.week_of_year") ؛ // 04. week_of_month Field TestCeCefection (Calendar.getInstance () ، calendar.week_of_month ، "calendar.week_of_month") ؛ // 05. اختبار ميداني التاريخ (calendar.getInstance () ، Calendar.date ، "Calendar.Date") ؛ // 06. Day_of_month Field TestCeCefection (Calendar.getInstance () ، Calendar.day_of_month ، "Calendar.day_of_month") ؛ // 07. day_of_year testCeection (calendar.getInstance () ، calendar.day_of_year ، "calendar.day_of_year") ؛ // 08. DAY_OF_WEEK field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK, "Calendar.DAY_OF_WEEK"); // 09. DAY_OF_WEEK_IN_MONTH field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK_IN_MONTH, "Calendar.DAY_OF_WEEK_IN_MONTH"); // 10. AM_PM field testSection(Calendar.getInstance(), Calendar.AM_PM, "Calendar.AM_PM"); // 11. HOUR field testSection(Calendar.getInstance(), Calendar.HOUR, "Calendar.HOUR"); // 12. HOUR_OF_DAY field testSection(Calendar.getInstance(), Calendar.HOUR_OF_DAY, "Calendar.HOUR_OF_DAY"); // 13. MINUTE field testSection(Calendar.getInstance(), Calendar.MINUTE, "Calendar.MINUTE"); // 14. SECOND field testSection(Calendar.getInstance(), Calendar.SECOND, "Calendar.SECOND"); // 15. MILLISECOND Field testSection(Calendar.getInstance(), Calendar.MILLISECOND, "Calendar.MILLISECOND"); // 16. ZONE_OFFSET Field testSection(Calendar.getInstance(), Calendar.ZONE_OFFSET, "Calendar.ZONE_OFFSET"); } /** * Test Calendar's "Compare Interface" */ private static void testComparatorAPIs() { // Create new cal1, and the time was 1988 Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, 1988); // Create cal2, and the time is 2000 Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, 2000); // Create cal3, which is a cloned object of cal111 Calendar cal3 = (Calendar)cal1.clone(); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal2 are equal boolean isEqual12 = cal1.equals(cal2); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal3 are equal boolean isEqual13 = cal1.equals(cal3); // Is cal1 boolean earlier than cal2 isBefore = cal1.before(cal2); // Is cal1 later than cal2 boolean isAfter = cal1.after(cal2); // Compare cal1 and cal2 // (01) If cal1 is earlier than cal2, return -1 // (02) If cal1 is equal to cal2, return 0 // (03) If cal1 is later than cal2, return 1 int icompare = cal1.compareTo(cal2); System.out.printf("/ntestComparatorAPIs: isEuqal12=%s, isEqual13=%s, isBefore=%s, isAfter=%s, icompare=%s/n", isEqual12, isEqual13, isBefore, isAfter, icompare); } /** * Test Calendar's "Compare Interface" */ private static void testLenientAPIs() { Calendar cal = Calendar.getInstance(); // Get the default "tolerance". Return true boolean oriLenient = cal.isLenient(); // The MONTH value can only be "0-11", and the bounds are exceeded here. However, since cal is currently tolerant, the exception cal.set(Calendar.MONTH, 50); // Set "tolerance" to false. cal.setLenient(false); // Get the set "tolerance" boolean curLenient = cal.isLenient(); try { // The MONTH value can only be "0-11", and the bounds are exceeded here. Moreover, cal is currently intolerant, so an exception will occur. // However, the exception will not be thrown until the next time the date is calculated. That is, the exception is not thrown back in set(), but the exception is not thrown until get() is cal.set(Calendar.MONTH, 50); // At this time, read cal. Reading will cause the value of cal to be recalculated, so an exception is thrown at this time! int m2 = cal.get(Calendar.MONTH); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.printf("/ntestLenientAPIs: oriLenient=%s, curLenient=%s/n", oriLenient, curLenient); } /** * Test Calendar's Date, TimeZone, MilliSecond and other related functions*/ private static void testTimeAPIs() { Calendar cal = Calendar.getInstance(); // Set the time zone of cal to "GMT+8" cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); // Get the current cal time zone TimeZone timezone = cal.getTimeZone(); // Set milliseconds cal.setTimeInMillis(1279419645742l); // Get milliseconds long millis = cal.getTimeInMillis(); // After setting milliseconds, the time also changed. // Get the date corresponding to cal Date date = cal.getTime(); // Set the time to "1988-08-08" cal.set(1988, 08, 08); // Set the time to "1999-09-09 09:09" cal.set(1999, 09, 09, 9, 9); // Set the time to "2000-10-10 10:10:10" cal.set(2000, 10, 10, 10, 10, 10); System.out.printf("/ntestTimeAPIs: date=%s, timezone=%s, millis=%s/n", date, timezone, millis); } /** * Test Calendar's clone(), getFirstDayOfWeek() and other interfaces*/ private static void testOtherAPIs() { Calendar cal = Calendar.getInstance(); //Clone cal Calendar clone = (Calendar)cal.clone(); // Set to 2013-01-10. // Note: 2013-01-01 is "Tuesday", 2013-01-06 is "Sunday", clone.set(Calendar.YEAR, 2013); clone.set(Calendar.MONTH, 0); clone.set(Calendar.DATE, 10); // Set "The first week of this year contains at least 1 day". // Then 2013-01-10 belongs to the second week clone.setMinimalDaysInFirstWeek(1); int m1 = clone.getMinimalDaysInFirstWeek(); int index1 = clone.get(Calendar.WEEK_OF_YEAR); // Set "The first week of this year contains at least 7 days". // Then 2013-01-10 belongs to the first week clone.setMinimalDaysInFirstWeek(7); int m2 = clone.getMinimalDaysInFirstWeek(); int index2 = clone.get(Calendar.WEEK_OF_YEAR); // Set "What day of the week is the first day of the week". clone.setFirstDayOfWeek(Calendar.WEDNESDAY); // Get "What day of the week is the first day of the week". int firstdayOfWeek = clone.getFirstDayOfWeek(); System.out.printf("/ntestOtherAPIs: firstdayOfWeek=%s, [minimalDay, WeekOfYear]={(%s, %s), (%s, %s)} %s/n", firstdayOfWeek, m1, index1, m2, index2, clone.getTime()); }}第五部分自定义的Calendar接口示例
这些接口在写日历程序时可能会用到。
源代码如下(CalendarSelfDefineTest.java):
import java.util.Calendar;/** * Some commonly used functions encapsulated according to Calendar's API*/public class CalendarSelfDefineTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Set the date to "2013-09-18" cal.set(2013, Calendar.SEPTEMBER, 18); // Get "year" System.out.printf("year: %s/n", getYear(cal) ); // Get "month" System.out.printf("month: %s/n", getMonth(cal) ); // Get "Last Month" System.out.printf("previcou month: %s/n", getLastMonth(cal) ); // Get "Next Month" System.out.printf("next month: %s/n", getNextMonth(cal) ); // Get "Day" System.out.printf("day: %s/n", getDay(cal) ); // Get Cal's corresponding weekly date System.out.printf("weekday: %s/n", getWeekDay(cal) ); // Number of days this month System.out.printf("Current Month days: %s/n", getMonthDays(cal) ); // Number of days last month System.out.printf("Previcous Month days: %s/n", getPrevMonthDays(cal) ); // Number of days next month System.out.printf("Next Month days: %s/n", getNextMonthDays(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the week of the last day of the current month System.out.printf("Last day' weekday : %s/n", getLastDayWeekday(cal) ); // Get the week of the last day of the previous month System.out.printf("PrevMonth Last day' weekday: %s/n", getLastDayWeekdayOfPrevMonth(cal) ); // Get the week of the first day of the next month System.out.printf("NextMonth First day' weekday: %s/n", getFirstDayWeekdayOfNextMonth(cal) ); } /** * Get "year" * * @return For example, 2013-09-18, it returns 2013 */ public static int getYear(Calendar cal) { return cal.get(Calendar.YEAR); } /** * Get "month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, 2013-09-18, return 8 */ public static int getMonth(Calendar cal) { return cal.get(Calendar.MONTH); } /** * Get "Last month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the last month of 2012-01-12 was "11" (i.e. DECEMBER). */ public static int getLastMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 11) % 12; } /** * Get "Next Month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the next month on 2013-12-12 is "1" (i.e. DECEMBER). */ public static int getNextMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 13) % 12; } /** * Get "day" * * @return For example, 2013-09-18, it returns 18 * */ public static int getDay(Calendar cal) { return cal.get(Calendar.DATE); } /** * Get "days of this month" * * @return For example, 2013-09-18, it returns 30 * */ public static int getMonthDays(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * Get "days in the previous month" * * @return For example, 2013-01-18, it returns 31 (because there are 31 days in 2012-12) * */ public static int getPrevMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, cal tmpCal.add(Calendar.MONTH, -1); // Set to "Last month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get "Number of days in the next month" * * @return For example, 2013-12-18, it returns 31 (because there are 31 days in 2014-01) * */ public static int getNextMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get the corresponding day of the week of Cal* * @return Return to "day of the week", which can be the following values: * SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY and SATURDAY. * SUNDAY is 1, MONDAY is 2, and so on. * For example, 2013-09-18 (Wednesday), return 4 */ public static int getWeekDay(Calendar cal) { return cal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding day of the week on the first day of the month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding week day of the week on the last day of the current month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.roll(Calendar.DATE, -1); // Set the date to the last day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week of the last day of the previous month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.add(Calendar.DATE, -1); // Set the date to the last day of the previous month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week offset of the first day of the next month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" tmpCal.set(Calendar.DATE, 1); // Set to "First Day" return tmpCal.get(Calendar.DAY_OF_WEEK); }}