ส่วนที่หนึ่งบทนำ
นิยามปฏิทิน:
ปฏิทินคลาสบทคัดย่อสาธารณะใช้งาน serializable, cloneable, เทียบเคียงได้ <alendar> {} ปฏิทินถือได้ว่าเป็นคลาสนามธรรม
การนำไปใช้ใช้วิธีการโรงงานในรูปแบบการออกแบบ มันปรากฏใน: เมื่อเราได้รับอินสแตนซ์ปฏิทินปฏิทินจะส่งคืนวัตถุปฏิทินที่เกี่ยวข้องตามพารามิเตอร์ที่ผ่าน มีสองวิธีในการรับอินสแตนซ์ปฏิทิน:
(1) เมื่อเราได้รับปฏิทินผ่านปฏิทิน GetInstance () ค่าเริ่มต้นคือวัตถุ Gregoriancalendar ที่ส่งคืน
Gregoriancalendar เป็นคลาสการดำเนินงานของปฏิทินที่ให้บริการระบบปฏิทินมาตรฐานที่ใช้ในประเทศส่วนใหญ่ในโลก
(2) เมื่อเราได้รับปฏิทินผ่านปฏิทิน GetInstance (เขตเวลาเขตเวลาสถานที่ตั้งสถานที่ตั้ง) หรือปฏิทิน GetInstance (เขตเวลาเขตเวลา) หรือปฏิทิน GetInstance (สถานที่ตั้ง) มันจะส่งคืน "ปฏิทินที่ใช้โดยเขตเวลาที่สอดคล้องกัน
ตัวอย่างเช่นหากเป็นญี่ปุ่นวัตถุของญี่ปุ่นจะถูกส่งคืน
อ้างถึงรหัสต่อไปนี้:
ปฏิทินสาธารณะคงที่ getInstance () {// เรียก createCalendar () เพื่อสร้างปฏิทินปฏิทิน = createCalendar (timezone.getDefaultref (), locale.getDefault ()); Cal.sharedzone = true; ส่งคืน cal;} ปฏิทินคงที่สาธารณะ getInstance (เขตเขตเวลา) {// เรียก createCalendar () เพื่อสร้างปฏิทินส่งคืน createCalendar (โซน, locale.getDefault ());} ปฏิทินสาธารณะคงที่ (locale alocale) {// Alocale); Cal.sharedzone = true; ส่งคืน cal;} ปฏิทินคงที่สาธารณะ getInstance (เขตเขตเวลา, locale alocale) {// เรียก createCalendar () เพื่อสร้างปฏิทิน return createCalendar (โซน, alocale); "jp" มันส่งคืนวัตถุ JapaneseEmperialCalendar ถ้า ("th" .equals (alocale.getLanguage ()) && ("th" .equals (alocale.getCountry ())) {ส่งคืน Sun.util.BuddhistCalendar (Zone, Alocale); } อื่นถ้า ("jp" .equals (alocale.getVariant ()) && "jp" .equals (alocale.getCountry ())) && "ja" .Equals (alocale.getLanguage ()))) } // (03) มิฉะนั้นให้ส่งคืนวัตถุ Gregoriancalendar คืน Gregoriancalendar ใหม่ (โซน, Alocale); -หลังจากที่เราได้รับอินสแตนซ์ปฏิทินเราสามารถจัดการปฏิทินผ่านบางวิธีคอลัมน์ที่จัดทำโดยปฏิทิน
ส่วนที่ 2 หลักการและความคิดของปฏิทิน
เมื่อเราใช้ปฏิทินเราไม่มีอะไรมากไปกว่าการดำเนินงานในสาขาของปฏิทิน "ปีเดือนวันสัปดาห์ชั่วโมงนาทีและที่สอง" ด้านล่างเราเรียนรู้แหล่งที่มาคำจำกัดความและวิธีการคำนวณของฟิลด์เหล่านี้
1. ปฏิทินแหล่งที่มาของแต่ละค่าฟิลด์
เมื่อเราใช้ปฏิทินเราเพียงแค่ใช้ข้อมูลเช่น "ปีเดือนวันสัปดาห์ชั่วโมงนาทีและที่สอง" แล้วมันทำได้อย่างไร? โดยพื้นฐานแล้วปฏิทินช่วยประหยัดเวลา คำจำกัดความต่อไปนี้:
// เวลาเป็นเวลาปัจจุบันเป็นมิลลิวินาที // มันเป็นความแตกต่างระหว่างระยะเวลาปัจจุบัน "1 มกราคม 1970, 0:00:00 GMT" ได้รับการปกป้องเป็นเวลานาน
ปฏิทินคำนวณข้อมูลเช่น "ปีปฏิทินเดือนเดือนวันสัปดาห์ชั่วโมงนาทีที่สอง" ตามเวลา
2. คำจำกัดความและการเริ่มต้นของแต่ละฟิลด์ของปฏิทิน
ข้อมูลของปฏิทิน "ปี, วัน, สัปดาห์, ชั่วโมงชั่วโมง, นาทีและครั้งที่สอง" มีทั้งหมด 17 ฟิลด์
เราใช้ปฏิทินซึ่งไม่มีอะไรมากไปกว่า 17 ฟิลด์เหล่านี้ คำจำกัดความของพวกเขามีดังนี้:
(ฟิลด์ 0) Public Final Static Int ERA = 0;
คำอธิบาย: ยุค.
ค่า: สามารถเป็น 0 หรือ 1 0 หมายถึง BC ("ก่อนพระคริสต์" นั่นคือ BC), 1 หมายถึงโฆษณา (ละติน "Anno Domini" นั่นคือ AD)
(ฟิลด์ 1) ปีสุดท้ายของสาธารณะคงที่ปี = 1;
คำอธิบาย: ปี
(ฟิลด์ 2) เดือนสุดท้ายของสาธารณะคงที่เดือน = 2;
คำอธิบาย: มูลค่ารายเดือน: สามารถคือมกราคม, กุมภาพันธ์, มีนาคม, เมษายน, พฤษภาคม, มิถุนายน, กรกฎาคม, สิงหาคม, กันยายน, ตุลาคม, พฤศจิกายน, ธันวาคม, undecimber
เดือนแรกของวันนี้คือเดือนมกราคมซึ่งก็คือ 0
(ฟิลด์ 3) สาธารณะสุดท้ายคงที่ 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;
Description: ค่าเช้าหรือช่วงบ่าย: สามารถเป็น AM หรือ PM AM คือ 0 ซึ่งบ่งบอกถึงเช้า PM คือ 1 ระบุช่วงบ่าย
(ฟิลด์ 10) ชั่วโมงสุดท้ายของสาธารณะ int hour = 10;
คำอธิบาย: ระบุชั่วโมงของวัน
ชั่วโมงใช้สำหรับนาฬิกา 12 ชั่วโมง (0 - 11) เที่ยงและเที่ยงคืนแสดงโดย 0 ไม่ใช่ 12
(ฟิลด์ 11) สาธารณะสุดท้ายคงที่ int hour_of_day = 11;
คำอธิบาย: ระบุชั่วโมงของวัน
Hour_of_day ใช้เวลาตลอด 24 ชั่วโมง ตัวอย่างเช่นในช่วงเวลา 10: 04: 15.250 PM, HORE_OF_DAY คือ 22
(ฟิลด์ 12) นาทีสุดท้ายของสาธารณะ int minute = 12;
Description: นาทีใดของชั่วโมง?
ตัวอย่างเช่นในขณะที่ 10: 04: 15.250 PM นาทีคือ 4
(ฟิลด์ 13) สาธารณะสุดท้ายคงที่ int ที่สอง = 13;
คำอธิบาย: อะไรที่สองในนาที
ตัวอย่างเช่นในขณะที่ 10: 04: 15.250 PM วินาทีคือ 15
(ฟิลด์ 14) มิลลิวินาทีสุดท้ายคงที่สาธารณะ = 14;
คำอธิบาย: มิลลิวินาทีของวินาที
ตัวอย่างเช่นในช่วงเวลา 10: 04: 15.250 PM มิลลิวินาทีคือ 250
(ฟิลด์ 15) สาธารณะสุดท้ายคงที่ int zone_offset = 15;
หมายเหตุ: มิลลิวินาทีระบุการชดเชยโดยประมาณจาก GMT
(ฟิลด์ 16) สาธารณะสุดท้ายคงที่ int dst_offset = 16;
คำอธิบาย: มิลลิวินาทีระบุถึงการชดเชยเวลาประหยัดเวลากลางวัน
สาธารณะสุดท้ายคงที่ int field_count = 17;
17 ฟิลด์เหล่านี้จะถูกบันทึกไว้ในอาร์เรย์ int คำจำกัดความมีดังนี้:
// บันทึกอาร์เรย์ของฟิลด์ 17 ฟิลด์ที่ได้รับการป้องกัน []; // ฟังก์ชั่นนิยามอาร์เรย์การป้องกันปฏิทิน (โซนเขตเวลา, locale alocale) {// เริ่มต้นฟิลด์ฟิลด์ array "ฟิลด์" new int [field_count]; isset = บูลีนใหม่ [field_count]; แสตมป์ = ใหม่ int [field_count]; this.zone = zone; setweekCountData (alocale);}ปฏิทินที่ได้รับการป้องกัน (เขตเขตเวลา, locale alocale) นี่คือตัวสร้างของปฏิทิน มันจะถูกเรียกโดยตัวสร้างคลาสย่อยดังนั้นการสร้างอาร์เรย์ใหม่ของ "บันทึกข้อมูลฟิลด์ 17 ของปฏิทิน"
3. ปฏิทินปฏิทินการคำนวณของแต่ละค่าฟิลด์
มารับ (ฟิลด์ int) เป็นตัวอย่างเพื่ออธิบายการคำนวณและการดำเนินงานของฟิลด์ 17 ของปฏิทินสั้น ๆ รับ (ฟิลด์ int) คือการได้รับค่าของฟิลด์ "ฟิลด์" คำจำกัดความของมันมีดังนี้:
สาธารณะ int get (ฟิลด์ int) {// คำนวณค่าของแต่ละฟิลด์เสร็จสมบูรณ์ (); // ส่งคืนค่าของฟิลด์ส่งคืน InternalGet (ฟิลด์);} หมายเหตุ: รหัสของ GET (ฟิลด์ int) นั้นง่ายมาก ขั้นแรกให้คำนวณค่าของแต่ละฟิลด์ผ่านเสร็จสมบูรณ์ () จากนั้นส่งคืน "ค่าของฟิลด์ฟิลด์" ผ่าน InternalGet (ฟิลด์)
ฟังก์ชั่นของ Complete () คือการคำนวณค่าของแต่ละฟิลด์ของปฏิทิน มันถูกกำหนดไว้ในปฏิทิน Java รหัสมีดังนี้:
Void Protected Complete () {ถ้า (! iStimeset) updateTime (); if (! arefieldsset ||! areallfieldsset) {computefields (); // เติมในฟิลด์ UNSET areAllFieldSSet = arefieldsSet = true; }} โมฆะส่วนตัว updateTime () {computEtime (); iStimeset = true;} updateTime () computEtime () ที่เรียกว่าถูกกำหนดไว้ในคลาสการใช้งานของปฏิทิน Java ด้านล่างนี้ฉันแสดงรายการการใช้งาน computeTime () ใน gregoriancalendar.java: void void computeTime () {// ในโหมดที่ไม่ใช่การใช้งานให้ทำการตรวจสอบสั้น ๆ ของปฏิทิน // ฟิลด์ที่ถูกตั้งค่าภายนอก ผ่าน // การตรวจสอบนี้ค่าฟิลด์จะถูกเก็บไว้ในต้นฉบับ [] // เพื่อดูว่ามีการทำให้เป็นมาตรฐานในภายหลังหรือไม่ if (! islenient ()) {ถ้า (OriginalFields == null) {OriginalFields = new int [field_count]; } สำหรับ (int field = 0; field <field_count; ฟิลด์ ++) {ค่า int = internalGet (ฟิลด์); if (isExternallySet (ฟิลด์)) {// การตรวจสอบอย่างรวดเร็วสำหรับค่าใด ๆ ที่อยู่นอกช่วงถ้า (ค่า <getMinimum (ฟิลด์) || ค่า> getMaximum (ฟิลด์)) {โยน unlegalArgumentException ใหม่ (getFieldName (ฟิลด์)); }} OriginalFields [ฟิลด์] = ค่า; }} // ให้คลาส Super พิจารณาว่าฟิลด์ปฏิทินใดที่จะเป็น // ใช้ในการคำนวณเวลา int fieldmask = selectfields (); // ปีเริ่มต้นถึงยุคเริ่มต้น เราไม่ตรวจสอบ // fieldmask สำหรับปีเพราะปีเป็นเขตข้อมูลบังคับให้ // กำหนดวันที่ int year = isset (ปี)? InternalGet (ปี): Epoch_year; int era = internalgetera (); if (era == bce) {ปี = 1 - ปี; } อื่นถ้า (ERA! = ce) {// แม้ในโหมด lenient เราไม่อนุญาตให้ค่า ERA อื่นนอกเหนือจาก CE & BCE // (กฎการทำให้เป็นมาตรฐานเดียวกันกับ Add ()/Roll () อาจเป็น // นำไปใช้ที่นี่ในโหมด Lenient แต่การตรวจสอบนี้จะถูกเก็บไว้ // ไม่เปลี่ยนแปลงสำหรับความเข้ากันได้ ณ 1.5) โยน unlegalargumentException ใหม่ ("ERA ไม่ถูกต้อง"); } // ถ้าปีเป็น 0 หรือลบเราต้องตั้งค่า ERA ในภายหลัง if (ปี <= 0 &&! isset (ERA)) {fieldMask | = ERA_MASK; SetFieldScomputed (ERA_MASK); } // คำนวณเวลาของวัน เราพึ่งพาการประชุมว่า // ฟิลด์ UNSET มี 0. เวลายาวนาน = 0; if (iSfieldSet (fieldMask, hour_of_day)) {timeofday += (ยาว) InternalGet (hour_of_day); } else {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 *= 1,000; timeofday += internalget (มิลลิวินาที); // แปลงเวลาของวันเป็นจำนวนวันและชดเชย // มิลลิวินาทีจากเที่ยงคืน Long ExpiedDate = timeofday / one_day; timeofday %= one_day; ในขณะที่ (timeofday <0) {timeofday += one_day; -FixedDate; } // คำนวณวันที่คงที่ตั้งแต่วันที่ 1 มกราคม 1 (Gregorian) calculateFixedDate: {Long GFD, JFD; if (ปี> GregorianCutoveryear && Year> GregorianCutoveryearjulian) {gfd = recideDate + getFixedDate (GCAL, Year, FieldMask); if (gfd> = gregoriancutoverdate) {recideDate = gfd; ทำลาย calculatedfixeddate; } jfd = exiderdate + getFixedDate (getJulianCalendarSystem (), ปี, FieldMask); } อื่นถ้า (ปี <gregoriancutoveryear && ปี <gregoriancutoveryearjulian) {jfd = recidedate + getFixedDate (getJulianCalendarSystem (), ปี, FieldMask); if (jfd <gregoriancutoverdate) {recideDate = jfd; ทำลาย calculatedfixeddate; } gfd = iscentDate + getFixedDate (GCAL, ปี, FieldMask); } else {gfd = exiderdate + getFixedDate (GCAL, ปี, FieldMask); jfd = rexiveDate + getFixedDate (getJulianCalendarSystem (), ปี, FieldMask); } // ตอนนี้เราต้องกำหนดวันที่ปฏิทิน if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {recideDate = gfd; } else {// วันที่อยู่ในช่วงเวลา "ซ้อนทับ" ไม่มีทาง // ที่จะทำให้ไม่เห็นด้วย กำหนดโดยใช้การคำนวณวันที่ // ก่อนหน้า if (calsys == gcal || calsys == null) {iscidedate = gfd; } else {exiderdate = jfd; }}} else {if (jfd <gregoriancutoverdate) {recideDate = jfd; } else {// วันที่อยู่ในช่วงเวลา "หายไป" if (! islenient ()) {โยน unlegalargumentException ใหม่ ("วันที่ที่ระบุไม่มีอยู่"); } // ใช้วันที่จูเลียนเพื่อเข้ากันได้ซึ่ง // จะสร้างวันที่ Gregorian recideDate = JFD; }}} // มิลลิสหมายถึงเวลานาฬิกาผนังในท้องถิ่นเป็นมิลลิวินาที Long Millis = (recideDate - EPOCH_OFFSET) * ONE_DAY + TIMEOFDAY; // คำนวณ Offset Zone Time และ DST ออฟเซ็ต ที่นี่มีสอง // ความคลุมเครือที่นี่ เราจะสมมติเวลา 2:00 น. (เวลากำแพง) เวลาสลับกัน // เพื่อจุดประสงค์ในการอภิปรายที่นี่ // 1. การเปลี่ยนเป็น DST ที่นี่เวลาที่ออกแบบมา 2:00 น. - 2:59 น. // สามารถอยู่ในมาตรฐานหรือใน DST ขึ้นอยู่กับ อย่างไรก็ตาม 2:00 น. เป็นตัวแทนที่ไม่ถูกต้อง // การเป็นตัวแทน (การเป็นตัวแทนกระโดดจาก 1:59:59 น. std ถึง 3:00:00 น. DST) // เราถือว่าเวลามาตรฐาน // 2. การเปลี่ยนแปลงจาก DST ที่นี่เวลาที่ออกแบบมา 1:00 น. - 1:59 น. // สามารถอยู่ในมาตรฐานหรือ DST ทั้งสองเป็นตัวแทนที่ถูกต้อง (ตัวแทน // กระโดดจาก 1:59:59 DST ถึง 1:00:00 STD) // อีกครั้งเราถือว่าเวลามาตรฐาน // เราใช้วัตถุเขตเวลาเว้นแต่ผู้ใช้จะตั้งค่าฟิลด์โซน _offset // หรือฟิลด์ dst_offset อย่างชัดเจน จากนั้นเราใช้ฟิลด์เหล่านั้น เขตเวลาโซน = getzone (); if (zoneOffSets == null) {zoneOffSets = ใหม่ int [2]; } int tzmask = fieldmask & (zone_offset_mask | dst_offset_mask); if (tzmask! = (zone_offset_mask | dst_offset_mask)) {ถ้า (zone instanceof zoneinfo) {(zoneinfo) โซน) .getoffsebywall (millis, zoneoffsets); } else {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 ()) {สำหรับ (int field = 0; field <field_count; ฟิลด์ ++) {ถ้า (! isexternallyset (ฟิลด์)) {ดำเนินการต่อ; } if (OriginalFields [field]! = InternalGet (ฟิลด์)) {// คืนค่าค่าฟิลด์ต้นฉบับ System.ArrayCopy (OriginalFields, 0, ฟิลด์, 0, Fields.length); โยน unlegalargumentException ใหม่ (GetfieldName (Field)); }}} setFieldSnormalized (หน้ากาก);} ถัดไปมาดูคำจำกัดความของ InternalGet (ฟิลด์) ดังนี้:
ได้รับการป้องกันขั้นสุดท้าย IntternalGet (ฟิลด์ int) {ฟิลด์ส่งคืน [ฟิลด์];} จากนี้เราจะเห็นว่าได้รับ (ฟิลด์ int) ในที่สุดจะส่งคืนค่าผ่าน InternalGet (ฟิลด์ int)
InternalGet (ฟิลด์ int) ส่งคืนองค์ประกอบฟิลด์ในอาร์เรย์ฟิลด์ สิ่งนี้สอดคล้องกับ 17 องค์ประกอบของปฏิทิน!
ในระยะสั้นสิ่งที่เราต้องเข้าใจคือ: ปฏิทินคำนวณ "ปีเดือนวันชั่วโมงนาทีที่สอง" และอื่น ๆ ตามเวลา (มิลลิวินาที) เพื่ออำนวยความสะดวกในการดำเนินงานของเราใน "ปี, วัน, ชั่วโมง, นาที, วินาที" ด้านล่างเราแนะนำฟังก์ชั่นการดำเนินการที่เกี่ยวข้องโดยปฏิทินด้านล่าง
ส่วนที่ 3 ส่วนต่อประสานฟังก์ชันปฏิทิน
1. อินเทอร์เฟซทั่วไปของ 17 ฟิลด์ของปฏิทิน
ปฏิทิน 17 ฟิลด์เหล่านี้รองรับอินเทอร์เฟซฟังก์ชั่นสาธารณะต่อไปนี้ สำหรับตัวอย่างของการใช้อินเทอร์เฟซทั่วไปเหล่านี้โปรดดูฟังก์ชั่น testallCalendarsections () ในตัวอย่างปฏิทิน Java
(1) getMaximum (ฟิลด์ int)
ฟังก์ชั่น: รับ "ค่าสูงสุดของฟิลด์" หมายเหตุ "เปรียบเทียบความแตกต่างระหว่างมันและ getactualmaximum ()" ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีใช้คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน cal = calendar.getInstance (); // รับค่าสูงสุดของเดือน int max = cal.getMaximum (calendar.month);
ในการรับค่าสูงสุดของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(2) getActualMaximum (ฟิลด์ int)
ฟังก์ชั่น: รับ "ค่าสูงสุดของฟิลด์นี้ภายใต้วันที่ปัจจุบัน" ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีใช้คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน cal = calendar.getInstance (); // รับค่าสูงสุดของเดือนปัจจุบัน 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)
ฟังก์ชั่น: รับ "ค่าต่ำสุดของฟิลด์" หมายเหตุ "เปรียบเทียบความแตกต่างระหว่างมันและ getactualminimum ()" ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีใช้คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน cal = calendar.getInstance (); // รับค่าต่ำสุดของเดือน int min = cal.getMinimum (calendar.month);
ในการรับค่าต่ำสุดของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(4) getActualMinimum (ฟิลด์ int)
ฟังก์ชั่น: รับ "ค่าต่ำสุดของฟิลด์นี้ภายใต้วันที่ปัจจุบัน" ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" ใช้วิธีการ: // รับอินสแตนซ์ปฏิทินปฏิทิน cal = calendar.getInstance (); // รับค่าต่ำสุดของเดือน int min = cal.getMinimum (calendar.month);
ในการรับค่าต่ำสุดของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
หมายเหตุ: ในปฏิทินเริ่มต้นของ Java แม้ว่า getMinimum () และ getactualminimum () มีความหมายที่แตกต่างกัน อย่างไรก็ตามค่าการคืนสินค้าของพวกเขาเหมือนกัน เนื่องจากค่าเริ่มต้นของปฏิทินคือการส่งคืนวัตถุ gregoriancalendar ใน gregoriancalendar.java, getMinimum () และ getActualMinimum () ส่งคืนค่าเดียวกัน
(5) รับ (ฟิลด์ int)
ฟังก์ชั่น: รับ "ค่าปัจจุบันของฟิลด์" รับค่าปัจจุบันของฟิลด์ฟิลด์ ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีการ "รับมูลค่าปัจจุบันของเดือน" คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน Cal = Calendar.getInstance (); // รับค่าเดือนปัจจุบันของ "Cal Calendar" int เดือน = Cal.Get (Calendar.month);
ในการรับค่าปัจจุบันของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(6) ตั้งค่า (ฟิลด์ int, ค่า int)
ฟังก์ชั่น: ตั้งค่า "ค่าปัจจุบันของฟิลด์" ตั้งค่าปัจจุบันของฟิลด์ฟิลด์เป็นตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีการ "การตั้งค่าปัจจุบันของเดือน" คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน Cal = Calendar.getInstance (); // ตั้งค่าเดือนปัจจุบันของ "Cal Calendar" เป็น 1988 Cal.Set (Calendar.month, 1988);
ภาพประกอบ:
A. 1988 เป็นมูลค่าปัจจุบันของเดือนที่คุณต้องการตั้งค่า ค่าการตั้งค่านี้จะต้องเป็นจำนวนเต็ม
B. ในการตั้งค่าปัจจุบันของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(7) เพิ่ม (ฟิลด์ int, ค่า int)
ฟังก์ชั่น: เพิ่มค่าให้กับ "ค่าปัจจุบันของฟิลด์" เพิ่มค่าให้กับค่าปัจจุบันของฟิลด์ฟิลด์ ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีนี้มีดังนี้:
// รับอินสแตนซ์ปฏิทินและตั้งวันที่เป็น "2013-09-01" ปฏิทิน Cal = Calendar.getInstance (); Cal.Set (Calendar.year, 2013); cal.set (Calendar.month, 8); Cal.set (Calendar.date, 1);
ภาพประกอบ:
A. -10 เป็นค่าเพิ่ม
ค่าเพิ่มอาจเป็นจำนวนบวกหรือลบ
จำนวนบวกระบุว่าวันที่เพิ่มขึ้นและจำนวนลบระบุว่าวันที่จะลดลง
สมมติฐาน: ตอนนี้มูลค่าของ CAL คือ "2013-09-01" ตอนนี้เราเพิ่มมูลค่าฟิลด์เดือน -10 ผลที่ได้คือ: "2012-10-01"
ทำไมสิ่งนี้ถึงเกิดขึ้น? "2013-09-01" เพิ่ม -10 ซึ่งหมายถึงการลดวันที่ไปข้างหน้า 10 เดือน ผลที่ได้คือ "2012-10-01"
B. ในบรรดา 17 ฟิลด์ของปฏิทิน: ยกเว้นการย้อนกลับปฏิทินการย้อนกลับ Zone_Offset ข้อยกเว้นที่ผิดกฎหมาย ExtrementException จะถูกโยนลงไป ฟิลด์อื่น ๆ สนับสนุนการดำเนินการนี้
C. ในการตั้งค่าปัจจุบันของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(8) ม้วน (ฟิลด์ int, ค่า int)
ฟังก์ชั่น: ย้อนกลับ "ค่าปัจจุบันของฟิลด์" ตัวอย่าง: ใช้ฟิลด์ "เดือน" วิธีการ "ย้อนกลับมูลค่าปัจจุบันของเดือน" คือ:
// รับอินสแตนซ์ปฏิทินและกำหนดวันที่ "2013-09-01" ปฏิทิน Cal = Calendar.getInstance (); Cal.Set (Calendar.year, 2013); cal.set (ปฏิทิน. month, 8); cal.set (Calendar.date, 1); //
ภาพประกอบ:
A. -10 คือค่าย้อนกลับ
เมื่อค่าย้อนกลับเป็นจำนวนลบมันหมายถึงการหมุนฟิลด์ปัจจุบันไปข้างหน้า
เมื่อค่าย้อนกลับเป็นจำนวนบวกมันหมายถึงการหมุนฟิลด์ปัจจุบันย้อนกลับ
เมื่อย้อนกลับสนามในปฏิทินอย่าเปลี่ยนสนามที่ใหญ่กว่า!
นี่คือความแตกต่างพื้นฐานระหว่างม้วน () และเพิ่ม ()! เพิ่ม () อาจเปลี่ยนฟิลด์ขนาดใหญ่เช่น "การใช้เพิ่ม () เพื่อแก้ไขฟิลด์ 'เดือน' อาจทำให้เกิดการเปลี่ยนแปลงในฟิลด์ 'ปี' แต่ Roll () จะไม่เปลี่ยนฟิลด์ขนาดใหญ่เช่น "การใช้ม้วน () เพื่อแก้ไขฟิลด์ 'เดือน' มันจะไม่ทำให้เกิดการเปลี่ยนแปลงในฟิลด์ 'ปี'
สมมติฐาน: ตอนนี้มูลค่าของ CAL คือ "2013-09-01" ตอนนี้เราเพิ่มมูลค่าฟิลด์เดือน -10 ผลที่ได้คือ: "2013-10-01"
ทำไมสิ่งนี้ถึงเกิดขึ้น? นี่เป็นเพราะ "การย้อนกลับ" หมายถึง "ย้อนกลับไปมาระหว่างขั้นต่ำและสูงสุด" ในตัวอย่างนี้เดือนกันยายนและการย้อนกลับก่อนหน้านี้คือ 10 และมูลค่าที่ได้คือตุลาคม แต่ Roll () จะไม่เปลี่ยนฟิลด์ "ใหญ่กว่าเดือน" ดังนั้นฟิลด์ปีจะไม่เปลี่ยนแปลง ดังนั้นผลลัพธ์คือ "2013-10-01"
B. ในบรรดา 17 ฟิลด์ของปฏิทิน: ยกเว้นการย้อนกลับปฏิทินการย้อนกลับ Zone_Offset ข้อยกเว้นที่ผิดกฎหมาย ExtrementException จะถูกโยนลงไป ฟิลด์อื่น ๆ สนับสนุนการดำเนินการนี้
C. ในการตั้งค่าปัจจุบันของฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่สอดคล้องกันในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(9) Clear (Int Field)
ฟังก์ชั่น: ล้าง "ค่าปัจจุบันของฟิลด์" การล้างที่เรียกว่าจริงตั้งค่าของ "ฟิลด์" เป็น 0; หากค่าต่ำสุดของฟิลด์คือ 1 จะถูกตั้งค่าเป็น 1 ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีการของ "เดือนที่ชัดเจน" คือ:
// รับอินสแตนซ์ปฏิทินและตั้งวันที่เป็น "กันยายน" ปฏิทิน cal = calendar.getInstance (); cal.set (ปฏิทิน. month, 9); // ล้าง monthcal.clear (Calendar.month);
ในการล้างฟิลด์อื่น ๆ คุณจะต้องแทนที่เดือนที่เกี่ยวข้องในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
(10) ISSET (ฟิลด์ int)
ฟังก์ชั่น: ตรวจสอบว่ามีการตั้งค่า“ ฟิลด์ฟิลด์” หรือไม่ หากเรียกว่า clear () ฟิลด์จะกลายเป็น "ไม่มีสถานะตั้ง" ตัวอย่าง: ในแง่ของฟิลด์ "เดือน" วิธีการ "ตัดสินว่าเดือนจะถูกกำหนด" คือ:
// รับอินสแตนซ์ปฏิทินปฏิทิน cal = calendar.getInstance (); // พิจารณาว่าเดือนถูกตั้งค่า boolean bset = cal.isset (Calendar.month);
ในการกำหนดเขตข้อมูลอื่น ๆ คุณจะต้องแทนที่เดือนที่เกี่ยวข้องในตัวอย่างด้วยชื่อฟิลด์อื่น ๆ
2. ฟังก์ชั่นอื่น ๆ ของปฏิทิน
(1) ฟังก์ชั่นการเปรียบเทียบวันที่
ฟังก์ชั่นการเปรียบเทียบของปฏิทินส่วนใหญ่รวมถึงสิ่งต่อไปนี้:
// เปรียบเทียบว่าวันที่เขตเวลาและเนื้อหาอื่น ๆ ของ "วัตถุปฏิทินปัจจุบัน" และ "ปฏิทิน" มีค่าเท่ากันหรือไม่ บูลีนเท่ากับ (วัตถุวัตถุ) // ว่าวัตถุปฏิทินปัจจุบันเร็วกว่าปฏิทินก่อน (ปฏิทินวัตถุ) // ว่าวัตถุปฏิทินปัจจุบันช้ากว่าปฏิทินหลังจาก (ปฏิทินวัตถุ) // เปรียบเทียบ "วัตถุปฏิทินปัจจุบัน" และ "ปฏิทิน" // ถ้าเร็วกว่า "ปฏิทิน" ให้ส่งคืน -1 // ถ้าเท่ากันให้ส่งคืน 0 // ถ้าช้ากว่า "ปฏิทิน" ให้ส่งคืน 1INT เปรียบเทียบกับ (ปฏิทินอีกคนหนึ่ง)
สำหรับตัวอย่างของการใช้ฟังก์ชั่นเหล่านี้โปรดดูฟังก์ชั่น TestComparatorApis () ในตัวอย่างปฏิทิน Java
ตัวอย่าง: สมมติว่า CAL1 และ CAL2 เป็นทั้งสองวัตถุของปฏิทิน
// วิธีการใช้งานของพวกเขามีดังนี้บูลีน isequal = cal1.equals (cal2); บูลีน isbefore = cal1.before (cal2); บูลีน isafter = cal1.after (cal2); int iCompare = cal1.compareto (Cal2);
(2) ฟังก์ชั่น "ความอดทน"
// ตั้งค่า "ปฏิทินความอดทน" เป็นโมฆะ setlenient (ค่าบูลีน) // รับ "ปฏิทินความทนทาน" Boolean islenient ()
สำหรับตัวอย่างของการใช้ฟังก์ชั่นเหล่านี้โปรดดูฟังก์ชั่น testlenientapis () ในตัวอย่างปฏิทิน Java
ภาพประกอบ:
ปฏิทินมีสองโหมดที่ตีความฟิลด์ปฏิทินคือความอ่อนโยนและไม่ยอมแพ้
A. เมื่อปฏิทินอยู่ในโหมด Lenient มันสามารถยอมรับค่าภายในช่วงที่ใหญ่กว่าช่วงของฟิลด์ปฏิทินที่สร้างขึ้น เมื่อปฏิทินคำนวณค่าฟิลด์ปฏิทินใหม่เพื่อให้ค่าเหล่านี้ถูกส่งคืนโดย GET () ฟิลด์ปฏิทินทั้งหมดจะถูกทำให้เป็นมาตรฐาน
ตัวอย่างเช่น gregoriancalendar ในโหมด lenient ตีความเดือน == มกราคม, day_of_month == 32 เป็น 1 กุมภาพันธ์
B. เมื่อปฏิทินอยู่ในโหมดที่ไม่ยอมแพ้หากมีความไม่สอดคล้องกันในฟิลด์ปฏิทินมันจะโยนข้อยกเว้น
ตัวอย่างเช่น Gregoriancalendar มักจะสร้างค่า day_of_month ระหว่าง 1 ถึงความยาวของเดือน หากค่าฟิลด์ใด ๆ ที่อยู่นอกช่วงได้รับการตั้งค่า Gregoriancalendar ในโหมดที่ไม่ยอมแพ้จะมีข้อยกเว้นเมื่อคำนวณค่าเวลาหรือค่าฟิลด์ปฏิทิน
หมายเหตุ: ข้อยกเว้นในขั้นตอน (02) จะไม่ถูกโยนทิ้งเมื่อใช้ set () แต่จะถูกโยนลงในฟังก์ชั่นเช่น get (), getTimeInmillis (), getTime (), เพิ่ม () และม้วน () เนื่องจาก set () เพียงแค่ตั้งค่าสถานะการปรับเปลี่ยนและวิธีการเช่น Get () จะทำให้เกิดการคำนวณเวลาใหม่และข้อยกเว้นจะถูกโยนลงในเวลานี้!
(3) "ปี, เดือน, วัน, เขตเวลา, ฟังก์ชั่นมิลลิวินาที
// ตั้งค่า "ปี, เดือน, วัน," ชุดโมฆะสุดท้าย (ปี int, เดือน, วัน, เวลา, เวลา, int ที่สอง) // set "ปี, เดือน, วัน, เวลา, เวลา, เวลา, int สอง) // set" ปี, วัน, เวลา, เวลา, นาทีที่สอง รับโซนเวลาที่สอดคล้องกับเขตเวลาตามปฏิทิน getTimezone () // ตั้งค่าเขตเวลาที่สอดคล้องกับโมฆะปฏิทิน settimezone (เขตเวลาเขตเวลา) // รับค่า milliscondes ที่สอดคล้องกับปฏิทินซึ่งเป็นเวลาหลายวัน ปฏิทินโมฆะ SettimeInmillis (มิลลิวินาทียาว)
สำหรับตัวอย่างของการใช้ฟังก์ชั่นเหล่านี้โปรดดูฟังก์ชั่น testTimeApis () ใน calendartest.java ตัวอย่าง
(4) การดำเนินการอื่น ๆ
// clone calendarObject clone () // รับ "วันใดของสัปดาห์เป็นวันแรกของสัปดาห์" ตัวอย่างเช่นในสหรัฐอเมริกาวันนี้คือวันอาทิตย์และในฝรั่งเศสวันนี้เป็นวันจันทร์ int getfirstdayofweek () // ตั้งค่า "วันใดของสัปดาห์เป็นวันแรกของสัปดาห์" ตัวอย่างเช่นในสหรัฐอเมริกาวันนี้คือวันอาทิตย์และในฝรั่งเศสวันนี้เป็นวันจันทร์ เป็นโมฆะ setFirstdayOfweek (ค่า int) // รับจำนวนวันต่ำสุดที่จำเป็นสำหรับสัปดาห์แรกของปี ตัวอย่างเช่นหากสัปดาห์แรกมีวันแรกของเดือนแรกของปีวิธีนี้จะกลับมา 1 ถ้าจำนวนวันต่ำสุดจะต้องเป็นสัปดาห์เต็มวิธีนี้จะกลับมา 7. int getminimaldaysinfirstweek () // กำหนดจำนวนวันแรกของวันที่ 1 หนึ่งสัปดาห์วิธีนี้เรียกว่ามีค่า 7. เป็นโมฆะ setminimaldaysinfirstweek (ค่า int)
สำหรับตัวอย่างของการใช้ฟังก์ชั่นเหล่านี้โปรดดูฟังก์ชั่น testotherapis () ใน calendartest.java ตัวอย่าง
ส่วนที่ 4 ตัวอย่างการใช้ปฏิทิน
ด้านล่างเราเรียนรู้ API โดยใช้ปฏิทินผ่านตัวอย่าง ซอร์สโค้ดของ Calendartest.java มีดังนี้:
นำเข้า java.util.date; นำเข้า java.util.calendar; นำเข้า java.util.timezone; นำเข้า java.util.random; ปฏิทินชั้นเรียนสาธารณะ // ทดสอบปฏิทิน "อินเทอร์เฟซเปรียบเทียบ" testComparatorapis (); // ทดสอบปฏิทิน "อินเทอร์เฟซเปรียบเทียบ" testlenientapis (); // วันที่ทดสอบปฏิทิน, เขตเวลา, มิลลิวินาทีและฟังก์ชั่นอื่น ๆ ที่เกี่ยวข้อง testtimeapis (); // ทดสอบปฏิทินของ clone (), getfirstdayofweek () และอินเทอร์เฟซอื่น ๆ testotherapis (); } /** * ทดสอบ "ฟิลด์ปฏิทิน" * * @param cal - วัตถุปฏิทิน * @param ฟิลด์ - "ฟิลด์ปฏิทิน" ที่จะทดสอบ สามารถเป็นค่าต่อไปนี้: * ปฏิทินปี, ปฏิทิน, month, calendar.date, ... ฯลฯ * @param ชื่อเรื่อง - ชื่อ */ การทดสอบโมฆะคงที่ส่วนตัว (ปฏิทิน Cal, ฟิลด์ int, ชื่อสตริง) {สุ่มสุดท้าย = ใหม่สุ่ม (ใหม่); วันที่สุดท้ายวันที่ = cal.getTime (); ขั้นสุดท้าย int min = cal.getMinimum (ฟิลด์); // รับ "ฟิลด์ค่าต่ำสุด" สุดท้าย int max = cal.getMaximum (ฟิลด์); // รับ "ฟิลด์ค่าสูงสุด" สุดท้าย int realmin = cal.getActualMinimum (ฟิลด์); // รับ "ค่าต่ำสุดของฟิลด์ภายใต้วันที่ปัจจุบัน" int final max = cal.getActualMaximum (ฟิลด์); // รับ "ค่าสูงสุดของฟิลด์ภายใต้วันที่ปัจจุบัน" // รับ "ค่าปัจจุบันของฟิลด์" int สุดท้าย ori = cal.get (ฟิลด์); // ตั้งค่า "ค่าปัจจุบันของฟิลด์" และรับ "ค่าหลังการตั้งค่า" สุดท้าย int r1 = random.nextint (สูงสุด); Cal.Set (Field, R1); set int สุดท้าย = cal.get (ฟิลด์); ลอง {// ย้อนกลับ "ค่าปัจจุบันของฟิลด์": ย้อนกลับระหว่าง "ค่าต่ำสุดของฟิลด์" และ "ค่าสูงสุดของฟิลด์" // "ค่าลูกกลิ้ง" อาจเป็นบวกหรือลบ Cal.Roll (ฟิลด์, -max); } catch (unlegalargumentException e) {// เมื่อฟิลด์ == calendar.zone_offset ข้อยกเว้นจะถูกโยนทิ้ง! E.PrintStackTrace (); } final int roll = cal.get (ฟิลด์); // รับค่าสุ่มค่าสุดท้าย int sign = (random.nextint (2) == 1)? 1: -1; int สุดท้าย r2 = sign * random.nextint (สูงสุด); ลอง {// เพิ่ม "ค่าปัจจุบันของฟิลด์" และรับ "ค่าฟิลด์ปัจจุบันใหม่" // "ค่าพารามิเตอร์" ของการเพิ่มอาจเป็นบวกหรือลบ Cal.Add (Field, R2); } catch (unlegalargumentException e) {// เมื่อฟิลด์ == calendar.zone_offset ข้อยกเว้นจะถูกโยนทิ้ง! E.PrintStackTrace (); } int สุดท้าย add = cal.get (ฟิลด์); // การพิมพ์ข้อมูลฟิลด์ System.out.printf ("%s:/n/trang คือ [%d -%d] acturerange คือ [%d -%d] ต้นฉบับ =%d, ชุด (%d) =%d, ม้วน (%d) =%d, เพิ่ม (%d) =%d/n" } / ** * ทดสอบปฏิทิน "อินเทอร์เฟซฟังก์ชั่นสาธารณะที่มี 17 ฟิลด์" * / โมฆะส่วนตัวแบบคงที่ testallCalendarSections () {// 00. การทดสอบภาคสนาม ERA (Calendar.getInstance (), Calendar.era, "Calendar.era"); // 01. การทดสอบภาคสนามปี (Calendar.getInstance (), ปฏิทิน. ปี, "Calendar.year"); // 02. การทดสอบภาคสนามเดือน (Calendar.getInstance (), Calendar.month, "Calendar.month"); // 03. Week_of_year Field Testsection (Calendar.getInstance (), Calendar.week_of_year, "Calendar.week_of_year"); // 04. Week_of_month Field Testsection (Calendar.getInstance (), Calendar.week_of_month, "Calendar.week_of_month"); // 05. การทดสอบภาคสนามวันที่ (Calendar.getInstance (), Calendar.date, "Calendar.date"); // 06. day_of_month field testsection (calendar.getInstance (), calendar.day_of_month, "calendar.day_of_month"); // 07. DAY_OF_YEAR field testSection(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); -