Часть первая введение
Определение календаря:
Общественный абстрактный класс календарь реализует сериализуемые, клонируемые, сопоставимые <Calendar> {} Календарь может рассматриваться как абстрактный класс.
Его реализация принимает метод завода в шаблоне проектирования. Он проявляется в: когда мы получаем экземпляр календаря, календарь вернет соответствующий объект календаря на основе пропущенных параметров. Есть два способа получить экземпляр календаря:
(1) Когда мы получаем календарь через Calendar.getInstance (), по умолчанию является возвратный объект GregorianCalendar.
GregorianCalendar - это класс внедрения календаря, который предоставляет стандартную календарную систему, используемую в большинстве стран мира.
(2) Когда мы получаем календарь через календарь. GetInstance (часовой часовой застрой, локаль) или календарь. GetInstance (часовой часовой застрой) или календарь. GetInstance (локальная локация), он возвращает «календарь, используемый соответствующим часовым поясом (зона) или региона (локальный) и т. Д.».
Например, если это Япония, японский объект -аспекты возвращается.
См. Следующий код:
Публичный статический календарь getInstance () {// call createcalendar () для создания календаря календаря = createcalendar (timezone.getdefaultref (), locale.getdefault ()); cal.sharedzone = true; вернуть cal;} public Static Calendar getInstance (Zone Timezone) {// call createcalendar () для создания календаря возврата createcalendar (Zone, locale.getDefault ());} Общественный статический календарь GetInstance (locale alocale) {// callecAlendar () create calendar = createCalendar) {// callecAlendar () Create Calendar = CreateCalendar) {// calendeftreftratrtratrtratrtratrtrtratrtratre (). Alocale); cal.sharedzone = true; Вернуть Cal;} Общественный статический календарь GetInstance (зона часового пояса, Locale Alocale) {// CALL CARECALENDAR () для создания календарного возврата CreateCALENDAR (ZONE, ALOCALE);} Частный статический календарь CreateCALENDAR (Timezone, Locale Alocale) {// (01), если региона является ", return -grodErdar) {// (01), если региона", return -grodend). является «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 ())) {return newforniMpercalendar (Zone, alocale); } // (03) В противном случае верните объект GregorianCalendar. вернуть новый GregorianCalendar (Zone, Alocale); }После того, как мы получим экземпляр календаря, мы можем манипулировать календарем с помощью некоторых методов столбцов, предоставленных календарем.
Часть 2 Принципы и мысли о календаре
Когда мы используем календарь, мы являемся не чем иным, как эксплуатацией поля календаря «Год, месяц, день, неделя, час, минута и второе». Ниже мы изучаем методы источника, определения и расчета этих полей.
1. Календарь источник каждого значения поля
Когда мы используем календарь, мы просто используем такую информацию, как «Год, месяц, день, неделя, час, минута и второе». Так как же это сделал? По сути, календарь экономит время. Следующее определение:
// время - это текущее время, в миллисекундах. // Это разница между текущим временным расстоянием "1 января 1970 года, 0:00:00 по Гринвичу". защищен долго;
Календарь рассчитывает информацию, такую как «Календарь года, месяц, день, неделя, час, минута, второй» в зависимости от времени.
2. Определение и инициализация каждого поля календаря
Информация о календаре «Год, месяц, день, неделя, час, минута и второй» содержит в общей сложности 17 полей.
Мы используем календарь, который является не чем иным, как эти 17 полей. Их определения следующие:
(Поле 0) публичная окончательная статическая int era = 0;
Описание: Эра.
Значение: может быть только 0 или 1. 0 означает BC («До Христа», то есть BC), 1 означает AD (латинский "Anno Domini", то есть AD).
(Поле 1) публичный окончательный статический год = 1;
Описание: Год.
(Поле 2) публичный окончательный статический месяц int = 2;
Описание: Ежемесячная стоимость: может быть январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь, ультрасовременный.
Первый месяц этого - январь, который составляет 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;
Описание: Утреннее или дневное значение: может быть я или PM. AM 0, указывая утро; PM - 1, указывая на день.
(Поле 10) Публичный окончательный статический час int = 10;
Описание: Указывает час дня.
Час используется для 12 -часовых часов (0 - 11). Полдень и полночь представлены 0, а не 12.
(Поле 11) Публичный окончательный статический int hour_of_day = 11;
Описание: Указывает час дня.
Hour_of_day используется для 24-часовых часов. Например, в момент 10: 04: 15.250, Hour_of_day 22.
(Поле 12) Публичная окончательная статическая минута = 12;
Описание: Какая минута часа?
Например, в момент 10: 04: 15.250, минута 4.
(Поле 13) Публичный окончательный статический int второй = 13;
Описание: что второе за минуту.
Например, в момент 10: 04: 15.250, второе - 15.
(Поле 14) публичный окончательный статический int millisecond = 14;
Описание: Какие миллисекунды секунды.
Например, в момент 10: 04: 15.250, миллисекунд - 250.
(Поле 15) Общественная окончательная статическая int Zone_offset = 15;
Примечание. Миллисекунды указывают приблизительное смещение от GMT.
(Поле 16) Публичный окончательный статический int dst_offset = 16;
Описание: миллисекунды указывают на смещение времени сэкономить дневное время.
Public Final Static int field_count = 17;
Эти 17 полей сохраняются в массиве Int. Определение выглядит следующим образом:
// Сохранить массив этих 17 полей, защищенных int Fields []; // Функциональный календарь определения массива (зона часового пояса, locale alocale) {// инициализировать "Массив поля" Fields = new int [field_count]; isset = new Boolean [field_count]; Stamp = new int [field_count]; this.zone = Zone; SetWeekCountData (AloCale);}Защищенный календарь (часовая зона, Locale Alocale) Это конструктор календаря. Он будет вызван конструктором подкласса, создавая тем самым новый массив «Сохранить 17 полевых данных календаря».
3. Календарь календаря Расчет каждого значения поля
Давайте возьмем Get (Int Field) в качестве примера, чтобы кратко объяснить расчет и работу 17 полей календаря. get (int field) - это получить значение поля «Поля». Его определение следующее:
public int get (int field) {// Рассчитать значения каждого поля // возвращать значение поля поля возвращаемое внутреннее (поле);} Примечание. Код GET (поле INT) очень прост. Сначала вычислите значения каждого поля через полное (), а затем верните «значение поля поля» через InternalGet (Field).
Функция fult () заключается в расчете значений каждого поля календаря. Это определено в календаре. Java, код выглядит следующим образом:
Защищенная void overse () {if (! iStimeSet) updateTime (); if (! arefieldsset ||! areallfieldsset) {computefields (); // заполняет в Unset Fields AREALLFIELDSSET = AREFIELDSSET = true; }} private void updateTime () {computetime (); istimeset = true;} updateTime () CompureTime () называется в классе реализации календаря. Java. Ниже я перечисляю реализацию Computetime () в gregoriancalendar.java: Protected void Computetime () {// в не-ленивом режиме выполните краткую проверку календаря // поля, которые были установлены извне. Благодаря этой // проверке значения поля хранятся в оригинальныхфилдсах [] //, чтобы увидеть, нормализованы ли какие -либо из них позже. if (! islenient ()) {if (originalfields == null) {originalfields = new int [field_count]; } for (int field = 0; field <field_count; field ++) {int value = internalget (field); if (isExternallySet (field)) {// Быстрая проверка для любых значений из диапазона, если (value <getMinimum (field) || Значение> getMaximum (Field)) {бросить новый allosalArgumentException (getFieldName (Field)); }} OriginalFields [Field] = value; }} // Пусть супер класс определит, какие поля календаря должны // используются для расчета времени. int fieldmask = selectFields (); // Год по умолчанию в эпоху начала. Мы не проверяем // FieldMask на год, потому что год является обязательным полетом для // определить дату. int Год = isset (год)? Internalget (год): epoch_year; int era = internalgettera (); if (era == bce) {Год = 1 - Год; } else if (era! = ce) {// Даже в мягком режиме мы запрещаем значения эры, кроме CE & Bce. // (то же правило нормализации, что и add ()/roll (), может быть // применять здесь, в мягком режиме. Но эта проверка сохраняется // не изменяется для совместимости по состоянию на 1.5.) Бросьте новое allodalargumentException («недействительная эра»); } // Если год - 0 или отрицательный, нам нужно установить значение ERA позже. if (год <= 0 &&! isset (era)) {fieldmask | = era_mask; SetFieldScomputed (ERA_MASK); } // Рассчитайте время суток. Мы полагаемся на соглашение о том, что // нераздельное поле имеет 0. Long Timeofday = 0; if (isfieldset (fieldmask, hour_of_day)) {timeofday += (long) internalget (hour_of_day); } else {timeOfday += intemporget (час); // Значение по умолчанию AM_PM равно 0, которое обозначает AM. if (isfieldset (fieldmask, am_pm)) {timeofday += 12 * internalget (am_pm); }} TimeOfDay *= 60; TimeOfday += InternalGet (минута); Время дня *= 60; TimeOfDay += InternalGet (второе); Время дня *= 1000; TimeOfday += InternalGet (миллисекунд); // Преобразовать время суток в количество дней и // миллисекундное смещение с полуночи. Long FixDate = TimeOfDay / One_Day; TimeOfday %= one_day; while (timeOfday <0) {timeOfDay += one_day; -fixeddate; } // Рассчитайте фиксированную дату с 1 января 1 (григорианский). Рассчитывать fixedDate: {Long GFD, JFD; if (год> gregoriancutoveryear && year> gregoriancutoveryearjulian) {gfd = fixdadate + getFixedDate (GCAL, Год, FieldMask); if (gfd> = gregoriancutoverdate) {fixdDate = gfd; перерыв рассчитываетсяфиксаддийт; } jfd = fixdDate + getFixedDate (getJulianCalendarSystem (), год, FieldMask); } else if (Год <gregoriancutoveryear && year <gregoriancutoveryearjulian) {jfd = fixdAtdate + getFixedDate (getJulianCalendarSystem (), год, FieldMask); if (jfd <gregoriancutoverdate) {fixdDate = jfd; перерыв рассчитываетсяфиксаддийт; } gfd = fixdDate + getFixEdDate (GCAL, Год, полевой маск); } else {gfd = fixdDate + getFixedDate (GCAL, Год, FieldMask); jfd = fixdDate + getFixedDate (getJulianCalendarSystem (), год, Fieldmask); } // Теперь мы должны определить, какая это дата календаря. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {fixdDate = gfd; } else {// дата находится в «перекрывающемся» периоде. Никакого пути //, чтобы устроить это. Определите это, используя расчет // предыдущая дата. if (calsys == gcal || calsys == null) {fixdDate = gfd; } else {fixdDate = jfd; }}} else {if (jfd <gregoriancutoverdate) {fixdDate = jfd; } else {// Дата находится в периоде «отсутствует». if (! Islenient ()) {бросить новый allosalargumentException («Указанная дата не существует»); } // Возьмите дату Джулиана для совместимости, которая // даст григорианскую дату. fixedDate = jfd; }}} // Миллис представляет локальное время настенного включения в миллисекундах. Long Millis = (FixdDate - EPOCH_OFFSET) * ONE_DAY + TIMEOFDAY; // Вычислить смещение часового пояса и смещение 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. Оба являются действительными представлениями (Rep // прыгает с 1:59:59 DST до 1:00:00 Std). // Опять же, мы предполагаем стандартное время. // Мы используем объект часового пояса, если только пользователь явно не установил поля Zone_Offset // или DST_OFFSET; Затем мы используем эти поля. Часовая зона = getzone (); if (ZoneOffsets == null) {ZoneOffsets = new Int [2]; } int tzmask = fieldmask & (zean_offset_mask | dst_offset_mask); if (tzmask! = (zean_offset_mask | dst_offset_mask)) {if (Zone instanceOf ZoneIinfo) {((ZoneInfo) Zone) .getOffSetsByWall (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 ()) {for (int field = 0; field <field_count; field ++) {if (! isexternallyset (field)) {продолжение; } if (OriginalFields [Field]! = InternalGet (Field)) {// восстановить исходную систему значений поля. ArrayCopy (OriginalFields, 0, Fields, 0, fields.length); бросить новое allogalargumentException (getfieldname (Field)); }}} setFieldSnormalized (mask);} Далее, давайте посмотрим на определение InternalGet (поле). следующее:
Защищенный конечный int intorne (int field) {return fields [field];} Из этого мы видим, что Get (INT Field) в конечном итоге возвращает значение через InternalGet (Int Field).
InternalGet (Int Field) фактически возвращает элемент поля в поле полевых массивов. Это соответствует 17 элементам календаря!
Короче говоря, нам нужно понять: календарь рассчитывает «Год, месяц, день, час, минута, второй» и т. Д. На основании времени (миллисекунды), чтобы облегчить нашу деятельность в «Год, месяц, день, час, минута, второе» и так далее. Ниже мы вводим соответствующие операционные функции, предоставленные календарем ниже.
Интерфейс функции календаря части 3
1. Общий интерфейс из 17 полей календаря
Эти 17 полей календаря поддерживают следующий интерфейс публичной функции. Для примеров использования этих общих интерфейсов, пожалуйста, обратитесь к функции TestallCalendarsections () в примере Calendartest.java.
(1) getMaximum (int field)
Функция: Получите «максимальное значение поля». Примечание «Сравните разницу между ним и GetActualMaximum ()». Пример: с точки зрения поля «месяца». Как его использовать:
// Получить календарь экземпляра календаря cal = calendar.getInstance (); // Получить максимальное значение месяца int max = cal.getmaximum (calendar.month);
Чтобы получить максимальное значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(2) GetActualMaximum (Int Field)
Функция: Получите «максимальное значение этого поля в текущую дату». Пример: с точки зрения поля «месяца». Как его использовать:
// Получить календарь экземпляра календаря 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 ()». Пример: с точки зрения поля «месяца». Как его использовать:
// Получить календарь экземпляра календаря cal = calendar.getinstance (); // Получить минимальное значение месяца int min = cal.getminimum (calendar.month);
Чтобы получить минимальное значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(4) GetActualMinimum (Int Field)
Функция: Получите «минимальное значение этого поля в текущую дату». Пример: с точки зрения поля «месяца». Использовать метод: // Получить календарь экземпляра календаря cal = calendar.getInstance (); // Получить минимальное значение месяца int min = cal.getminimum (calendar.month);
Чтобы получить минимальное значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
Примечание: в календаре Java по умолчанию, хотя GetMinimum () и GetActualMinimum () имеют разные значения; Однако их возвратные значения одинаковы. Поскольку дефолт в календаре состоит в том, чтобы вернуть объект GregorianCalendar, в gregoriancalendar.java, getminimum () и getactualminimum () возвращает одно и то же значение.
(5) получить (int field)
Функция: Получите «текущее значение поля». Получает текущее значение поля поля. Пример: с точки зрения поля «месяца». Метод «получить текущую стоимость месяца»:
// Получить календарь экземпляра календаря cal = calendar.getInstance (); // Получить значение текущего месяца «Календарь календаря».
Чтобы получить текущее значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(6) Установите (поле int, значение int)
Функция: установите «текущее значение поля». Установите текущее значение поля поля в Пример значения: в терминах поля «месяца». Метод «Установки текущего значения месяца»:
// Получить календарь экземпляра календаря cal = calendar.getInstance (); // Установить значение текущего месяца «Календарь календаря» на 1988 г. Cal.Set (Calendar.Month, 1988);
иллюстрировать:
A. 1988 - текущая стоимость месяца, который вы хотите установить. Это значение настройки должно быть целым числом.
B. Чтобы установить текущее значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(7) Добавить (поля int, int value)
Функция: добавьте значение к «текущему значению поля». Добавьте значение к текущему значению поля поля. Пример: с точки зрения поля «месяца». Метод заключается в следующем:
// Получить экземпляр календаря и установить дату на «2013-09-01» календарь cal = calendar.getinstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.set (calendar.date, 1); // Добавить -10 "cal.add (calendar.month, -10);
иллюстрировать:
А. -10 является дополнительным значением.
Дополнительное значение может быть положительным или отрицательным числом.
Положительное число указывает на то, что дата увеличена, а отрицательное число указывает на то, что дата уменьшается.
Предположение: теперь стоимость CAL-«2013-09-01», теперь мы увеличиваем поле поля месяца -10. Результат: «2012-10-01».
Почему это происходит? «2013-09-01» увеличивает -10, что означает сокращение даты вперед на 10 месяцев; Результатом является «2012-10-01».
B. Среди 17 полей календаря: за исключением календаря, отпускаемого обратного. Другие поля поддерживают эту операцию.
C. Чтобы установить текущее значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(8) Roll (Int Field, int value)
Функция: отката от «текущего значения поля» Пример: возьмите поле «месяц». Метод «отката назад текущего значения месяца»:
// Получить экземпляр календаря и установить дату на «2013-09-01» календарь cal = calendar.getinstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.set (calendar.date, 1); // "Прокрутите вперед 10" Cal.Roll (Calendar.Month, -10);
иллюстрировать:
А. -10 -значение отката.
Когда значение отката является отрицательным числом, оно означает, что он высказывает текущее поле вперед;
Когда какое -то значение является положительным числом, это означает, что он будет кататься по текущему полю назад.
При отказе от поля в календаре не меняйте большее поле!
Это базовая разница между Roll () и add ()! add () может изменить более крупные поля, такие как «Использование add () для изменения поля« месяца », это может привести к изменению в поле« Год »»; Но Roll () не будет изменять более крупные поля, такие как «Использование Roll () для изменения поля« месяца », он не приведет к изменению в поле« Год »».
Предположение: теперь стоимость CAL-«2013-09-01», теперь мы увеличиваем поле поля месяца -10. Результат: «2013-10-01».
Почему это происходит? Это связано с тем, что «откат» означает «кататься взад и вперед между минимумом и максимумом». В этом примере месяц - сентябрь, а предыдущий откат составляет 10, а полученное значение - октябрь, но Roll () не изменит поле «больше месяца», поэтому поле года не изменится. Таким образом, результат-«2013-10-01».
B. Среди 17 полей календаря: за исключением календаря, отпускаемого обратного. Другие поля поддерживают эту операцию.
C. Чтобы установить текущее значение других полей, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
(9) Чистый (int field)
Функция: очистить «текущее значение поля». Так называемая очистка фактически устанавливает значение «поле» до 0; Если минимальное значение поля составляет 1, оно установлено на 1. Пример: в терминах поля «месяца». Метод «чистого месяца»:
// Получить экземпляр календаря и установить дату в календарь «сентябрь» cal = calendar.getinstance (); cal.set (calendar.month, 9); // clear monthcal.clear (calendar.month);
Чтобы очистить другие поля, вам нужно только заменить соответствующий месяц в примере другими именами поля.
(10) Isset (Int Field)
Функция: Определите, установлено ли «поле поля». Если clear () называется, поле становится «без установленного состояния». Пример: с точки зрения поля «месяца». Метод «судить о том, установлен ли месяц»:
// Получить календарь экземпляра календаря cal = calendar.getInstance (); // определить, установлен ли месяц boolean bset = cal.isset (calendar.month);
Чтобы определить другие поля, вам нужно только заменить соответствующий месяц в примере на другие имена поля.
2. Другие функции календаря
(1) Функция сравнения даты
Функция сравнения календаря в основном включает в себя следующее:
// сравнивают, равны ли дата, часовой пояс и другое содержание «текущего объекта календаря» и «календарь». Boolean Equals (объект объекта) // Будет ли текущий объект календаря ранее, чем календарно -кладовый до (календарь объекта) // Будет ли текущий объект календаря позже, чем календарный календарь после (объектный календарь) // Сравнение «Объект текущего календаря» и «календарь». // Если раньше, чем «календарь», вернуть -1 // Если равен, вернуть 0 //, если позже, чем «календарь», вернуть 1 -й по сравнению с (календарь другой календарь)
Примеры использования этих функций, пожалуйста, обратитесь к функции TestComparatorApis () в примере Calendartest.java.
Пример: предположим, что Cal1 и Cal2 являются двумя объектами календаря.
// Их методы использования следующие следующие логические isecal = cal1.equals (cal2); логический isbefore = cal1.fore (cal2); логический iSafter = cal1.fter (cal2); int icompare = cal1.compareto (cal2);
(2) Функция «толерантность»
// Установите «Толерантность к календаре» void setlenient (логическое значение) // Получить «толерантность к календаре» Boolean Islenient ()
Примеры использования этих функций, пожалуйста, обратитесь к функции TestlenientApis () в примере Calendartest.java.
иллюстрировать:
Календарь имеет два режима, которые интерпретируют календарные поля, а именно снисходительную и не-ленинку.
A. Когда календарь находится в мягком режиме, он может принимать значения в большем диапазоне, чем диапазон календарных полей, которые он генерирует. Когда календарь пересчитывает значения поля календаря, так что эти значения возвращаются с помощью get (), все поля календаря нормализованы.
Например, gregoriancalendar в мягком режиме интерпретирует месяц == январь, day_of_month == 32, как 1 февраля.
B. Когда календарь находится в режиме не-ленин-режима, если в его календарном поле есть несоответствие, он вызовет исключение.
Например, Gregoriancalendar всегда генерирует значение day_of_month от 1 до длины месяца. Если были установлены какие-либо значения поля за пределами диапазона, GregorianCalendar в режиме не-леница вызывает исключение при расчете времени или значений поля календаря.
Примечание. Исключение в шаге (02) не будет брошено при использовании set (), но будет добавлен только в такие функции, как get (), gettimeInmillis (), getTime (), add () и roll (). Потому что Set () просто устанавливает флаг модификации, и такие методы, как get (), приведут к пересчете времени, и в настоящее время будет брошено исключение!
(3) «Год, месяц, день, часовой пояс, миллисекундные функции
// Установить «Год, месяц, день», «Окончательный набор void» (int Год, месяц, день, время, время, int second) // set «Год, месяц, день, время, время, int second) // set», год, месяц, день, время, минута, второй «окончательный набор void (int, месяц, день, минута, второй) // Получить дату Получите часовой пояс, соответствующий календарному часовому поясу getTimeZone () // Установите часовой пояс, соответствующий календарю void settimezone (часовой часовой застрой) // Получить значение Milliscondes, соответствующее календарю, которая является миллисекундами «Calendar Current Date» от «1970-01-01 0:00:00:00 gmt». Календарь void settimeinmillis (длинные миллисекунды)
Для примеров использования этих функций, пожалуйста, обратитесь к функции TestTimeApis () в примере CalendArdArtest.java.
(4) Другие операции
// Clone Calendarobject Clone () // Получить «Какой день недели - первый день недели». Например, в Соединенных Штатах этот день воскресенье, а во Франции этот день - понедельник. int getfirstdayOfweek () // установить «Какой день недели - первый день недели». Например, в Соединенных Штатах этот день воскресенье, а во Франции этот день - понедельник. void setfirstdayOfweek (int value) // Получает минимальное количество дней, необходимых в течение первой недели года. Например, если первая неделя содержит первый день первого месяца года, этот метод вернется 1. Если минимальное количество дней должно быть полной неделей, этот метод возвращается 7. int getminimaldaysinfirstweek () // Устанавливает минимальное количество дней, требуемых в первую неделю года, например, если первая неделя содержит первый день первого года. Будь полной недели, этот метод вызывается со значением 7. void setminimaldaysinfirstweek (int value)
Для примеров использования этих функций, пожалуйста, обратитесь к функции TestOtherapis () в примере Calendartest.java.
Часть 4 Пример использования календаря
Ниже мы изучаем API с использованием календаря с помощью примеров. Исходный код Calendartest.java выглядит следующим образом:
Импорт java.util.date; import java.util.calendar; import java.util.timezone; import java.util.random; открытый класс Calendartest {public Static void main (String [] args) {// Test Calendar «Общедоступный функциональный интерфейс с 17 Fields» TestallCalendarsections (); // тестовый календарь «сравнительный интерфейс» TestComparatorApis (); // тестовый календарь «сравнительный интерфейс» TestlenientApis (); // ДАТА CALENDAR TEST, Timezone, Millisecond и другие связанные функции Testtimeapis (); // Clone Clone Test (), GetFirstDayOfweek () и другие интерфейсы testotherapis (); } /** * Тест "Поле календаря" * * @param cal - объект календаря * @param field - "Поле календаря" для проверки. Может быть следующие значения: * calendar.year, calendar.month, calendar.date, ... и т. Д. Окончательная дата дата = cal.gettime (); final int min = cal.getminimum (поле); // получить «Минимальное значение поля» окончательное int max = cal.getMaximum (поле); // Получить "максимальное значение поля" окончательный int actactymin = cal.getactualminimum (field); // Получить «минимальное значение поля в текущую дату» окончательный int intactmax = cal.getActualMaximum (Field); // Получить "максимальное значение поля в текущую дату" // Получить "текущее значение поля" окончательный int ori = cal.get (field); // Установить «текущее значение поля» и получить «значение после настройки» окончательного int r1 = random.nextint (max); Cal.Set (Field, R1); окончательный int set = cal.get (field); Попробуйте {// откатить «текущее значение поля»: откатитесь между «минимальным значением поля» и «максимальным значением поля». // «роликовое значение» может быть положительным или отрицательным. Cal.roll (Field, -max); } catch (allogalargumentException e) {// when field == calendar.zone_offset, исключение будет брошено! e.printstacktrace (); } final int roll = cal.get (field); // Получить случайное значение окончательное int sign = (random.nextint (2) == 1)? 1: -1; окончательный int r2 = sign * random.nextint (max); Попробуйте {// добавить «текущее значение поля» и получить «Новое значение тока поля» // «Значение параметра» добавления может быть положительным или отрицательным. Cal.Add (Field, R2); } catch (allogalargumentException e) {// when field == calendar.zone_offset, исключение будет брошено! e.printstacktrace (); } final int add = cal.get (field); // Информационная система поля печати. } / ** * Тестовый календарь "Интерфейс публичной функции с 17 полями" * / Private static void testallendarsections () {// 00. ERA Field Testsection (Calendar.getInstance (), Calendar.era, "Calendar.era"); // 01. Год полевой тест (Calendar.getInstance (), Calendar.year, "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); }}