1 부 소개
캘린더 정의 :
공개 초록 클래스 캘린더는 직렬화 가능하고 클로닝 가능하며 비슷한 <Calendar> {}을 구현합니다. 캘린더는 추상 클래스로 간주 될 수 있습니다.
구현은 설계 패턴에서 공장 방법을 채택합니다. 캘린더 인스턴스를 얻을 때 캘린더는 전달 된 매개 변수에 따라 해당 캘린더 개체를 반환합니다. 달력 인스턴스를 얻는 두 가지 방법이 있습니다.
(1) Calendar.getInstance ()를 통해 캘린더를 얻을 때 기본값은 GregorianCalendar 객체가 반환되었습니다.
GregorianCalendar는 세계 대부분의 국가에서 사용되는 표준 캘린더 시스템을 제공하는 구현 클래스입니다.
(2) Calendar.getInstance (Timezone Timezone, Locale Locale) 또는 Calendar.getInstance (TimeZone Timezone) 또는 Calendar.getInstance (Locale Locale)를 통해 달력을 얻을 때 "해당 시간대 (영역) 또는 영역 (로컬) 등에 사용되는 캘린더를 반환합니다.
예를 들어, 일본인 경우 일본식 캘린더 객체가 반환됩니다.
다음 코드를 참조하십시오.
public static calendar getInstance () {// createCalendar ()를 호출하여 캘린더 캘린더를 생성하기 위해 = createCalendar (timezone.getDefaultRef (), locale.getDefault ()); cal.sharedzone = true; return cal;} public static calendar getInstance (Timezone Zone) {// createCalendar ()을 호출하여 createcalendar (Zone, locale.getDefault ());} createcalendar (locale alocale) {// createcalendar (createcalendar) (timeecalendar) Alocale); cal.sharedzone = true; Return Cal;} 공개 정적 캘린더 getInstance (TimeZone Zone, Locale alocale) {// createcalendar () 호출 캘린더 리턴 CreateCalendar (Zone, Alocale);} 개인 정적 캘린더 CreateCalendar (TimeZone Zone, Locale Alocale) {// (01)가 "TH"라는 경우 ", 불교의 반품" "JP", If ( "th".Equals (alocale.getLanguage ()) && ( "th".Equals (alocale.getCountry ())) {return new Sun.util.buddhistCalendar (Zone, Alocale); } else if ( "jp".equals (alocale.getVariant ()) && "jp".equals (alocale.getCountry ())) && "ja".equals (alocale.getlanguage ()))) {새로운 일본식 단순화 캘린더 (Zone, alocale); } // (03) 그렇지 않으면 GregorianCalendar 객체를 반환하십시오. 새로운 GregorianCalendar (Zone, Alocale)를 반환합니다. }캘린더 인스턴스를 얻은 후 캘린더에서 제공 한 일부 열 메소드를 통해 캘린더를 조작 할 수 있습니다.
파트 2 캘린더의 원칙과 생각
캘린더를 사용할 때, 우리는 캘린더의 "연도, 월, 일, 주, 시간, 시간, 두 번째"의 필드를 운영하는 것 이상입니다. 아래에서는이 필드의 소스, 정의 및 계산 방법을 배웁니다.
1. 각 필드 값의 소스입니다
캘린더를 사용할 때는 단순히 "연도, 월, 주, 주, 시간, 분, 두 번째"와 같은 정보를 사용합니다. 그래서 어떻게 했습니까? 기본적으로 캘린더는 시간을 절약합니다. 다음 정의 :
// 시간은 현재 시간이며 밀리 초입니다. // 현재 시간 거리는 "1970 년 1 월 1 일, 0:00:00 GMT"의 차이입니다. 보호 된 오랜 시간;
캘린더는 시간을 기준으로 "연도, 월, 주, 주, 시간, 두 번째"와 같은 정보를 계산합니다.
2. 각 캘린더 필드의 정의 및 초기화
캘린더의 "연도, 월, 주, 주, 시간, 분, 두 번째"정보에는 총 17 개의 필드가 있습니다.
우리는이 17 개의 필드에 지나지 않는 캘린더를 사용합니다. 그들의 정의는 다음과 같습니다.
(필드 0) 공개 최종 정적 Int Era = 0;
설명 : 시대.
가치 : 0 또는 1. 0은 기원전을 의미 할 수 있습니다.
(필드 1) 공개 최종 정적 int 연도 = 1;
설명 : 연도.
(필드 2) 공개 최종 정적 int 월 = 2;
설명 : 월별 가치 : 1 월, 2 월, 3 월, 4 월, 5 월, 6 월, 7 월, 8 월, 9 월, 10 월, 11 월, 12 월, 미색.
이 첫 달은 1 월입니다.
(필드 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;
설명 : 아침 또는 오후 가치 : AM 또는 PM이 될 수 있습니다. AM은 0이며 아침을 나타냅니다. 오후는 1이며 오후를 나타냅니다.
(필드 10) 공개 최종 정적 int 시간 = 10;
설명 : 하루의 시간을 나타냅니다.
시간은 12 시간 시계 (0-11)에 사용됩니다. 정오와 자정은 12가 아닌 0으로 표시됩니다.
(필드 11) 공개 최종 정적 int hough_of_day = 11;
설명 : 하루의 시간을 나타냅니다.
Hour_of_day는 24 시간 시계에 사용됩니다. 예를 들어, 오후 10 : 04 : 15.250의 순간에 Hour_of_day는 22입니다.
(필드 12) 공개 최종 정적 int minute = 12;
설명 : 한 시간 몇 분?
예를 들어, 오후 10 : 04 : 15.250의 순간에는 분이 4입니다.
(필드 13) 공개 최종 정적 int Second = 13;
설명 : 1 분 후
예를 들어, 오후 10 : 04 : 15.250의 순간에 두 번째는 15입니다.
(필드 14) 공개 최종 정적 int 밀리 초 = 14;
설명 : 1 초 밀리 초.
예를 들어, 오후 10시 04 분 15.250 분의 순간에 밀리 초는 250입니다.
(필드 15) 공개 최종 정적 int Zone_offset = 15;
참고 : 밀리 초에는 GMT의 대략적인 오프셋을 나타냅니다.
(필드 16) 공개 최종 정적 int dst_offset = 16;
설명 : 밀리 초에는 일광 절약 시간의 오프셋을 나타냅니다.
공개 최종 정적 int field_count = 17;
이 17 개의 필드는 INT 배열에 저장됩니다. 정의는 다음과 같습니다.
//이 17 개의 필드 보호 된 int 필드의 배열을 저장합니다 []; // 배열 정의 함수 보호 캘린더 (Timezone Zone, Locale alocale) {// "필드 배열"필드 초기화 = new int [field_count]; isset = 새로운 부울 [Field_count]; Stamp = new int [Field_count]; this.zone = Zone; setWeekCountData (Alocale);}보호 된 캘린더 (TimeZone Zone, Locale Alocale) 이것은 캘린더의 생성자입니다. 서브 클래스 생성자에 의해 호출되므로 "17 개의 필드 데이터 저장 캘린더"를 생성합니다.
3. 달력 각 필드 값의 계산
캘린더의 17 개 필드의 계산 및 작동을 간략하게 설명하기 위해 Get (int Field)를 예로 들어 보겠습니다. get (int field)는 "필드"필드의 가치를 얻는 것입니다. 그 정의는 다음과 같습니다.
public int get (int field) {// 각 필드의 값을 계산합니다 (); // 필드 필드의 값을 반환합니다. 반환 내부 세트 (필드);} 참고 : get 코드 (int 필드)는 매우 간단합니다. 먼저 완료 ()를 통해 각 필드의 값을 계산 한 다음 내부 세트 (필드)를 통해 "필드 필드의 값"을 반환하십시오.
완성 ()의 함수는 각 캘린더 필드의 값을 계산하는 것입니다. Calendar.java에 정의되며 코드는 다음과 같습니다.
Protected void complete () {if (! istimeset) updateTime (); if (! arefieldsset ||! areallfieldsset) {computeFields (); // Unset 필드를 채우는데 areallfieldsset = arefieldsset = true; }} private void updateTime () {computeTime (); istimeset = true;} updateTime () computetime ()는 구현 클래스의 Calendar.java에 정의됩니다. 아래에는 gregoriancalendar.java에서 computetime ()의 구현을 나열합니다. Protected void compupetime () {// 비 레인트 모드에서는 외부에서 설정된 캘린더 // 필드를 간단히 점검합니다. 이 // 점검을 통해 필드 값은 원래 필드 [] // 나중에 정규화되는지 확인합니다. if (! islenient ()) {if (OriginalFields == null) {OriginalFields = new int [field_count]; } for (int field = 0; field <field_count; field ++) {int value = 내부 세트 (필드); if (isexternallyset (field)) {// 범위를 벗어난 범위 값에 대한 빠른 유효성을 if (value <getminimum (필드) || value> getmaximum (field)) {throw new neveralargumentexception (getfieldName (field)); }} originalFields [필드] = 값; }} // 슈퍼 클래스가 시간을 계산하는 데 사용되는 // 어떤 캘린더 필드를 결정하도록하십시오. int fieldmask = selectFields (); // 올해는 신기원의 기본값을 시작합니다. 연도는 // 날짜를 결정할 수있는 필수 필드이기 때문에 // FieldMask를 확인하지 않습니다. int 년 = isset (연도)? 내부 세트 (연도) : epoch_year; int era = internalgetera (); if (ERA == BCE) {년 = 1- 년; } else if (ERA! = CE) {// 관대 모드에서도 CE & BCE 이외의 ERA 값을 허용하지 않습니다. // (add ()/roll ()과 동일한 정규화 규칙은 관대 한 모드로 여기에 적용될 수 있습니다. 그러나이 점검은 // 1.5에서 호환성을 위해 변경되지 않은 상태로 유지됩니다. } // 연도가 0이거나 음수 인 경우 나중에 ERA 값을 설정해야합니다. if (Year <= 0 &&! isset (ERA)) {FieldMask | = ERA_MASK; setfieldscomputed (ERA_MASK); } // 시간을 계산합니다. 우리는 // unset 필드가 0. Long Timeofday = 0을 가지고 있다는 컨벤션에 의존합니다. if (isfieldset (FieldMask, Hour_of_day)) {timeofday += (long) 내부 세트 (Houst_of_day); } else {timeofday += 내부 세트 (시간); // am_pm의 기본값은 0입니다. if (isfieldset (fieldmask, am_pm)) {timeofday += 12 * 내부 세트 (am_pm); }} timeofday *= 60; TimeOfday += 내부 세트 (분); 시간의 시간 *= 60; TimeOfday += 내부 세트 (두 번째); 시간의 시간 *= 1000; TimeOfday += 내부 세트 (밀리 초); // 시간을 자정부터 일의 수와 // 밀리 초 오프셋으로 변환합니다. Long FixedDate = TimeOfday / One_day; 시간의 시간 %= one_day; while (timeofday <0) {timeofday += one_day; -fixedDate; } // 1 월 1 일 이후 고정 날짜를 계산합니다 (Gregorian). 계산 문제 : {Long GFD, JFD; if (Year> Gregoriancutoveryear && year> gregoriancutoveryearjulian) {gfd = fixeddate + getfixeddate (gcal, year, fieldmask); if (gfd> = gregoriancutoverdate) {fixedDate = gfd; 브레이크 계산 문제; } jfd = fixedDate + getFixEdDate (getJulianCalendArsystem (), 연도, FieldMask); } else if (Year <gregoriancutoveryear && year <gregoriancutoveryearjulian) {jfd = fixeddate + getfixedDate (getJulianCalendArsyStem (), 연도, FieldMask); if (jfd <gregoriancutoverdate) {fixedDate = jfd; 브레이크 계산 문제; } gfd = fixeddate + getfixedDate (gcal, 연도, FieldMask); } else {gfd = fixeddate + getfixedDate (gcal, 연도, Fieldmask); jfd = fixeddate + getfixedDate (getJulianCalendArsystem (), 연도, FieldMask); } // 이제 우리는 그것이 어떤 캘린더 날짜인지 결정해야합니다. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {fixedDate = gfd; } else {// 날짜는 "겹치는"기간입니다. // 그것을 명확하게 할 방법이 없습니다. // 이전 날짜 계산을 사용하여 결정하십시오. if (calsys == gcal || calsys == null) {fixedDate = gfd; } else {fixedDate = jfd; }}} else {if (jfd <gregoriancutoverdate) {fixedDate = jfd; } else {// 날짜는 "누락 된"기간입니다. if (! islenient ()) {새로운 불법 불법 행위 ( "지정된 날짜가 존재하지 않는다"); } // Julian Date를 호환성으로 가져 가면 // Gregorian 날짜를 생성합니다. FIXEDDATE = JFD; }}} // millis는 현지 벽 클록 시간을 밀리 초의 로컬 벽 클록 시간을 나타냅니다. long millis = (고정 날짜 - epoch_offset) * One_day + timeofday; // 시간대 오프셋 및 DST 오프셋을 계산합니다. 여기에는 두 가지 잠재적 // 모호성이 있습니다. 토론 목적으로 오전 2시 (벽 시간) 전환 시간을 가정합니다. // 1. DST로의 전환. 여기서, 오전 2시 - 오전 2시 59 분 //의 설계된 시간은 표준에 따라 또는 DST에있을 수 있습니다. 그러나 오전 2시는 잘못된 // 표현입니다 (표현은 1:59:59 AM STD에서 3:00:00 AM DST에서 점프합니다). // 표준 시간을 가정합니다. // 2. DST에서 전환. 여기서 오전 1시 - 오전 1시 59 분 //의 설계된 시간은 표준 또는 DST에있을 수 있습니다. 둘 다 유효한 표현입니다 (Rep //는 1:59:59 DST에서 1:00:00 STD에서 점프). // 다시 표준 시간을 가정합니다. // 사용자가 Zone_offset // 또는 dst_offset 필드를 명시 적으로 설정하지 않는 한 TimeZone 객체를 사용합니다. 그런 다음 해당 필드를 사용합니다. TimeZone Zone = 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 instanceof ZoneInfo) {((ZoneInfo) Zone) .getOffsetSbyWall (Millis, ZoneOffsets); } else {int gmtoffset = isfieldset (FieldMask, Zone_offset)? 내장 (Zone_offset) : Zone.getRawoffset (); Zone.getOffsets (Millis -Gmtoffset, ZoneOffsets); }} if (tzmask! = 0) {if (isfieldset (tzmask, Zone_offset)) {ZoneOffsets [0] = 내부 세트 (Zone_offset); } if (isfieldset (tzmask, dst_offset)) {ZoneOffsets [1] = 내부 세트 (dst_offset); }} // 시간대 오프셋 값을 조정하여 UTC 시간을 얻습니다. millis- = ZoneOffsets [0] + ZoneOffsets [1]; //이 캘린더의 시간을 밀리 초 시간으로 설정하십시오. 시간 = millis; int mask = computeFields (FieldMask | getSetStateFields (), Tzmask); if (! islenient ()) {for (int field = 0; field <field_count; field ++) {if (! isexternallyset (field)) {계속; } if (or 새로운 불법 행위 (getfieldName (필드))을 던지십시오. }}} setfieldsnormalized (마스크);} 다음으로 내부 세트 (필드)의 정의를 살펴 보겠습니다. 다음과 같이 :
보호 된 최종 int internet (int field) {return fields [field];} 이것으로부터 우리는 get (int field)가 궁극적으로 Internetget (int field)을 통해 값을 반환한다는 것을 알 수 있습니다.
InternalGet (int field)은 실제로 필드 어레이에서 필드 요소를 반환합니다. 이것은 17 가지 달력 요소에 해당합니다!
요컨대, 우리가 이해해야 할 것은 다음과 같습니다. 달력은 "연도, 월, 시간, 분, 두 번째"연도 (밀리 초)에 따라 "연도, 월, 일, 시간, 분, 두 번째"등의 작업을 용이하게합니다. 아래에서는 아래 달력에서 제공하는 관련 작업 기능을 소개합니다.
파트 3 캘린더 기능 인터페이스
1. 17 개의 캘린더 필드의 일반적인 인터페이스
이 17 개의 캘린더 필드는 다음과 같은 공개 기능 인터페이스를 지원합니다. 이러한 공통 인터페이스를 사용하는 예는 Calendartest.java 예제의 TestallCalendarsections () 함수를 참조하십시오.
(1) getmaximum (int 필드)
기능 : "필드의 최대 값"을 얻으십시오. "그것과 getActualMaximum ()의 차이를 비교하십시오." 예 : "Month"필드 측면에서. 사용하는 방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // 월의 최대 값을 가져옵니다 int max = cal.getmaximum (calendar.month);
다른 필드의 최대 값을 얻으려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(2) getactualmaximum (int 필드)
기능 : "현재 날짜 에이 필드의 최대 값"을 얻으십시오. 예 : "Month"필드 측면에서. 사용하는 방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 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"입니다. 현재 날짜는 9 월이고 9 월은 30 일입니다. 따라서 getActualMaximum (Calendar.Date)의 반환 값은 "30"입니다!
(3) getminimum (int 필드)
기능 : "필드의 최소값"을 얻으십시오. "그것과 getactualminimum ()의 차이를 비교하십시오." 예 : "Month"필드 측면에서. 사용하는 방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // 월의 최소값을 가져옵니다 int min = cal.getminimum (calendar.month);
다른 필드의 최소값을 얻으려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(4) getactualminimum (int 필드)
기능 : "현재 날짜 에이 필드의 최소값"을 받으십시오. 예 : "Month"필드 측면에서. 사용 방법 : // 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // 월의 최소값을 얻습니다 int min = cal.getminimum (calendar.month);
다른 필드의 최소값을 얻으려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
참고 : Java의 기본 캘린더에서는 getMinimum ()과 getActualMinimum ()이 다른 의미를 지니고 있지만. 그러나 그들의 반환 값은 동일합니다. 캘린더 기본값은 GregorianCalendar 객체를 반환하는 것이므로 gregoriancalendar.java에서 getMinimum () 및 getActualMinimum () 동일한 값을 반환하는 것입니다.
(5) get (int field)
기능 : "필드의 현재 값"을 얻으십시오. 필드 필드의 현재 값을 가져옵니다. 예 : "Month"필드 측면에서. "현재 달의 값을 얻는"방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // "cal calendar"int month = cal.get (calendar.month)의 현재 달 값을 가져옵니다.
다른 필드의 현재 값을 얻으려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(6) set (int field, int value)
기능 : "필드의 현재 값"을 설정하십시오. 필드 필드의 현재 값을 값으로 설정하십시오. 예 : "Month"필드의 관점에서. "월의 현재 값을 설정"하는 방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // "cal calendar"의 현재 달 값을 1988 cal.set (Calendar.month, 1988)으로 설정합니다.
설명 :
A. 1988은 설정하려는 달의 현재 가치입니다. 이 설정 값은 정수 여야합니다.
B. 다른 필드의 현재 값을 설정하려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(7) 추가 (int 필드, int 값)
기능 : "필드의 현재 값"에 값을 추가하십시오. 필드 필드의 현재 값에 값을 추가하십시오. 예 : "Month"필드 측면에서. 이 방법은 다음과 같습니다.
// 캘린더 인스턴스를 가져 와서 날짜를 "2013-09-01"Calendar Cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); calendar.date, 1); // calendd (calendar.month, -10)로 설정합니다.
설명 :
A. -10은 부가 가치입니다.
부가 가치는 양수 또는 음수 일 수 있습니다.
양수는 날짜가 증가했음을 나타내고, 음수는 날짜가 감소했음을 나타냅니다.
가정 : 이제 CAL의 가치는 "2013-09-01"이며, 이제 우리는 월 필드 값 -10을 증가시킵니다. 결과는 "2012-10-01"입니다.
왜 이런 일이 일어나고 있습니까? "2013-09-01"은 -10을 증가시켜 날짜를 10 개월 줄인다는 것을 의미합니다. 결과는 "2012-10-01"입니다.
B. 17 개의 캘린더 분야 중 : 롤백 캘린더를 제외하고 ZONE_OFFSET를 제외하고, 불법 행위 예외 예외가 발생합니다. 다른 필드는이 작업을 지원합니다.
C. 다른 필드의 현재 값을 설정하려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(8) 롤 (int 필드, int 값)
기능 : "필드의 현재 값"을 롤백하십시오. 예 : "Month"필드를 가져갑니다. "현재 달의 현재 값을 롤백하는"방법은 다음과 같습니다.
// 달력 인스턴스를 가져 와서 날짜를 "2013-09-01"Calendar Cal = Calendar.getInstance (); Cal.set (Calendar.year, 2013); Cal.set (Calendar.month, 8); Calendar.Date, 1); "Calendar.Month, -10);
설명 :
A. -10은 롤백 값입니다.
롤백 값이 음수 인 경우 현재 필드를 앞으로 굴리는 것을 의미합니다.
롤백 값이 양수 인 경우 현재 필드를 뒤로 굴리는 것을 의미합니다.
캘린더에서 필드를 롤백 할 때 더 큰 필드를 변경하지 마십시오!
이것은 roll ()와 add ()의 기초 차이입니다! add ()는 "add ()를 사용하여 '달'필드를 수정하면 '연도'필드를 변경할 수 있습니다. 그러나 Roll ()는 " 'Month'필드를 수정하기 위해 Roll ()을 사용하여 '연도'필드의 변경을 유발하지 않습니다."와 같은 더 큰 필드를 변경하지 않습니다.
가정 : 이제 CAL의 가치는 "2013-09-01"이며, 이제 우리는 월 필드 값 -10을 증가시킵니다. 결과는 "2013-10-01"입니다.
왜 이런 일이 일어나고 있습니까? "롤백"은 "최소와 최대 사이의 롤을 오가는 것"을 의미하기 때문입니다. 이 예에서, 월은 9 월이고, 이전 롤백은 10이며, 얻은 값은 10 월이지만 Roll ()은 "달보다 큰 필드를 변경하지 않으므로 연도 필드는 변경되지 않습니다. 결과는 "2013-10-01"입니다.
B. 17 개의 캘린더 분야 중 : 롤백 캘린더를 제외하고 ZONE_OFFSET를 제외하고, 불법 행위 예외 예외가 발생합니다. 다른 필드는이 작업을 지원합니다.
C. 다른 필드의 현재 값을 설정하려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(9) Clear (Int Field)
기능 : "필드의 현재 값"을 지우십시오. 소위 청소는 실제로 "필드"의 값을 0으로 설정합니다. 필드의 최소값이 1 인 경우 1로 설정됩니다. 예 : "Month"필드 측면에서. "명확한 달"의 방법은 다음과 같습니다.
// 달력 인스턴스를 가져 와서 날짜를 "9 월"Calendar Cal = calendar.getInstance (); cal.set (calendar.month, 9)으로 설정합니다. // Monthcal.clear (Calendar.month);
다른 필드를 지우려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
(10) ISSET (Int Field)
기능 : "필드 필드"가 설정되어 있는지 확인하십시오. Clear () 호출되면 필드는 "상태 없음 상태"가됩니다. 예 : "Month"필드 측면에서. "월이 설정되어 있는지 판단하는"방법은 다음과 같습니다.
// 캘린더 인스턴스 캘린더 cal = calendar.getInstance (); // 월을 설정하는지 여부를 결정합니다 bset = cal.isset (calendar.month);
다른 필드를 결정하려면 예제의 해당 월을 다른 필드 이름으로 바꾸면됩니다.
2. 달력의 다른 기능
(1) 날짜 비교 함수
캘린더의 비교 기능은 주로 다음을 포함합니다.
// "현재 달력 객체"및 "캘린더"의 날짜, 시간대 및 기타 내용이 동일인지 비교하십시오. Boolean Equals (Object Object) // 현재 달력 객체가 이전 캘린더 블린보다 초기이든 (개체 캘린더) // 현재 캘린더 개체가 (개체 캘린더) 이후 CalendarBoolean보다 늦게 "현재 캘린더 개체"및 "캘린더"비교. // "캘린더"보다 이른 경우 -1 // 동일하게 반환하고, 0 // "캘린더"보다 늦게 반환하고, 1int compactto (calendar onthercalendar)를 반환합니다.
이러한 함수를 사용하는 예는 Calendartest.java 예제의 TestComparatorapis () 함수를 참조하십시오.
예 : CAL1과 CAL2가 모두 달력의 두 객체라고 가정합니다.
// 사용 방법은 다음과 같습니다. 부울 isequal = cal1.equals (cal2); boolean isbefore = cal1.before (cal2); boolean isafter = cal1.after (cal2); int icompare = cal1.compareto (cal2);
(2) "공차"기능
// "캘린더 공차"void setLenient (부울 값) 설정 // "Calendar Overance"Boolean Islenient ()
이러한 함수를 사용하는 예는 Calendartest.java 예제의 TestLenientApis () 함수를 참조하십시오.
설명 :
캘린더에는 캘린더 필드를 해석하는 두 가지 모드, 즉 관대하고 비 레인트가 있습니다.
A. 캘린더가 관대 한 모드에 있으면 생성하는 캘린더 필드 범위보다 넓은 범위 내에서 값을 허용 할 수 있습니다. 캘린더가 get ()에 의해 반환되도록 캘린더 필드 값을 다시 계산하면 모든 캘린더 필드가 정규화됩니다.
예를 들어, 관대 한 모드의 GregorianCalendar는 Month == 1 월, day_of_month == 32를 2 월 1 일에 해석합니다.
B. 캘린더가 비 레인트 모드 일 때, 캘린더 필드에 불일치가 있으면 예외가 발생합니다.
예를 들어, GregorianCalendar는 항상 1에서 달의 길이 사이의 day_of_month 값을 생성합니다. 범위 외부의 필드 값이 설정된 경우 비 레인트 모드의 GregorianCalendar는 시간 또는 캘린더 필드 값을 계산할 때 예외를 던집니다.
참고 : STEP (02)의 예외는 set ()를 사용할 때 발생하지 않지만 get (), gettimeinmillis (), gettime (), add () 및 roll ()과 같은 함수에만 던져집니다. set ()는 수정 플래그를 설정하면 get ()와 같은 메소드가 시간 재 계산을 일으키고 현재 예외가 발생하므로 예외가 발생하기 때문입니다!
(3) "연도, 월, 일, 시간대, 밀리 초 기능
// "연도, 월, 일,"최종 void set (int 연도, 월, 일, 시간, 시간, int 두 번째) // "연도, 월, 일, 시간, 시간, int seg"연도, 월, 일, 시간, 시간, 분, 두 번째 "최종 무효 세트 (int 연도, 월, 일, 시간, 두 번째) // 캘린더 최종 날짜를 얻는 날짜 () // date get ()에 해당하는 날짜 Get () // 캘린더 타임 존 ()에 해당하는 타임 존을 가져옵니다 gettimezone () // 달력 무효 Settimezone (TimeZone Timezone)에 해당하는 시간대를 설정하십시오. // 캘린더에 해당하는 밀리 스코드 값을 가져옵니다. 이는 "1970-01-01-00:00 gmt"gettimemillis (gettimemillis)의 "캘린더 현재 날짜"거리의 밀리 초입니다. 달력 무효 SettimeInmillis (긴 밀리 초)
이러한 함수를 사용하는 예는 Calendartest.java 예제의 TestTimeApis () 함수를 참조하십시오.
(4) 기타 작업
// 복제 CalendarObject Clone () // "요일의 요일은 요일"을 얻습니다. 예를 들어, 미국에서는이 날이 일요일과 프랑스에서는이 날이 월요일입니다. int getfirstdayofweek () // "요일의 요일은 요일"입니다. 예를 들어, 미국에서는이 날이 일요일과 프랑스에서는이 날이 월요일입니다. void setfirstdayofweek (int value) // 연중 첫 주에 필요한 최소 일 수를 얻습니다. 예를 들어, 첫 주에 연중 첫 달의 첫날이 포함 된 경우,이 방법은 1 회 반환됩니다.이 방법은 1 주일이어야하는 경우이 방법은 7 일을 반환합니다. int getminimaldaysinfirstweek () // 첫 주에 첫 주가 포함 된 경우,이 방법이 1 일에 포함 된 경우, 1 일의 가치가 있다면,이 방법은 1 일입니다. 일주일 내내이 방법은 7의 값으로 호출됩니다. void setminimaldaysinfirstweek (int value)
이러한 함수를 사용하는 예는 Calendartest.java 예제의 Testotherapis () 함수를 참조하십시오.
파트 4 캘린더 사용 예제
아래에서 예제를 통해 달력을 사용하여 API를 배웁니다. Calendartest.java의 소스 코드는 다음과 같습니다.
import java.util.date; import java.util.calendar; import java.util.timezone; import java.util.random; public calendartest {public static void main (String [] args) {// Test Calendar의 "17 개의 fields가있는 공개 함수 인터페이스"testallcalendarsections (); // Test Calendar의 "비교 인터페이스"TestComparatorApis (); // Test Calendar의 "비교 인터페이스"TestLenientApis (); // 테스트 캘린더 날짜, 시간대, 밀리 초 및 기타 관련 기능 testtimeApis (); // Test Calendar 's Clone (), getFirstDayofWeek () 및 기타 인터페이스 testotherapis (); } /** * 테스트 "캘린더 필드" * * @param cal- 캘린더 개체 * @param 필드 - "캘린더 필드"를 테스트합니다. 다음 값이 될 수 있습니다. 최종 날짜 = cal.gettime (); 최종 int min = cal.getminimum (필드); // "필드 최소값"을 얻습니다. 최종 int max = cal.getMaximum (필드); // "필드 최대 값"최종 int int recallmin = cal.getActualMinimum (필드); // "현재 날짜 아래 필드의 최소값"을 가져옵니다. "최종 int recallymax = cal.getActualMaximum (필드); // "현재 날짜에 필드의 최대 값"을 가져옵니다 "//"필드의 현재 값 "최종 int ori = cal.get (필드); // "필드의 현재 값"을 설정하고 "설정 후 값"최종 int r1 = random.nextint (max); Cal.set (필드, R1); 최종 int set = cal.get (필드); {// 롤백 "필드의 현재 값": "필드의 최소값"과 "필드의 최대 값"사이의 롤백을 롤백하십시오. // "롤러 값"은 양수 또는 부정적 일 수 있습니다. cal.roll (필드, -max); } catch (delegalArgumentException e) {// field == calendar.zone_offset의 경우 예외가 발생합니다! e.printstacktrace (); } 최종 int roll = cal.get (필드); // 임의의 값을 가져옵니다. 최종 int 부호 = (random.nextInt (2) == 1)? 1 : -1; 최종 int r2 = 부호 * random.nextint (max); {// "필드의 현재 값"을 추가하고 "새로운 전류 필드 값"을 얻으십시오. // add의 "매개 변수 값"은 양수 또는 음수 일 수 있습니다. cal.add (필드, R2); } catch (delegalArgumentException e) {// field == calendar.zone_offset의 경우 예외가 발생합니다! e.printstacktrace (); } 최종 int add = cal.get (필드); // Print Field Information System.out.printf ( "%s :/n/trang은 [%d -%d] 실제 레인지는 [%d-%d]입니다. 원래 =%d, set (%d) =%d, 롤 (%d) =%d, 추가 (%d) =%d/n", 제목, Min, Max, Recallmin, Ori, R1, set, roll, r2, add); } / ** * 테스트 캘린더의 "17 개의 필드가있는 공개 기능 인터페이스" * / 개인 정적 무효 testallcalendarsections () {// 00. ERA 필드 테스트 (calendar.getInstance (), calendar.era, "calendar.era"); // 01. 연도 필드 테스트 (Calendar.getInstance (), calendar.year, "calendar.year"); // 02. Month Field Testsection (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 필드 테스트 (Calendar.getInstance (), calendar.week_of_month, calendar.week_of_month "); // 05. 날짜 필드 테스트 (Calendar.getInstance (), calendar.date, "calendar.date"); // 06. day_of_month 필드 테스트 (calendar.getInstance (), calendar.day_of_month, calendar.day_of_month "); // 07. day_of_year 필드 테스트 (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); }}