YEAR = 1970, MONTH = JANUARY, DATE = 1 и т.д.
Для считывания и установки различных 'частей' даты используются методы get(int field), set(int field, int value), add(int field, int amount), roll(int field, int amount), переменная типа int с именем field указывает на номер поля, с которым нужно произвести операцию. Для удобства все эти поля определены в Calendar как статические константы типа int.
Рассмотрим подробнее порядок выполнения перечисленных методов.
Метод set(int field,int value).
Как уже говорилось, данный метод производит установку какого-либо поля даты. На самом деле после вызова этого метода немедленного пересчета даты не производится. Пересчет даты будет осуществлен только после вызова методов get(), getTime() или getTimeInMillis(). Таким образом, последовательная установка нескольких полей не вызовет ненужных вычислений. Помимо этого, появляется еще один интересный эффект. Рассмотрим следующий пример. Предположим, что дата установлена на последний день августа. Необходимо перевести ее на последний день сентября. Если бы внутреннее представление даты изменялось после вызова метода set, то при последовательной установке полей мы получили бы вот такой эффект:
public class Test { public Test() { } public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat('yyyy MMMM dd HH:mm:ss'); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR,2002); cal.set(Calendar.MONTH,Calendar.AUGUST); cal.set(Calendar.DAY_OF_MONTH,31); System.out.println(' Initialy set date: ' + sdf.format(cal.getTime())); cal.set(Calendar.MONTH,Calendar.SEPTEMBER); System.out.println(' Date with month changed : ' + sdf.format(cal.getTime())); cal.set(Calendar.DAY_OF_MONTH,30); System.out.println(' Date with day changed : ' + sdf.format(cal.getTime())); } } Пример 14.1.
Результатом будет:
Initialy set date: 2002 August 31 22:57:47 Date with month changed : 2002 October 01 22:57:47 Date with day changed : 2002 October 30 22:57:47 Пример 14.2.
Как мы видим, в данном примере при изменении месяца день месяца остался неизменным и было унаследовано его предыдущее значение. Но поскольку в сентябре 30 дней, дата автоматически была переведена на 1 октября, и когда было бы установлено 30 число, оно относилось бы уже к октябрю. В следующем примере считывание даты не производится, соответственно, ее вычисление не выполняется до тех пор, пока все поля не установлены:
public class Test { public Test() { } public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat('yyyy MMMM dd HH:mm:ss'); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR,2002); cal.set(Calendar.MONTH,Calendar.AUGUST); cal.set(Calendar.DAY_OF_MONTH,31); System.out.println(' Initialy set date: ' + sdf.format(cal.getTime())); cal.set(Calendar.MONTH,Calendar.SEPTEMBER); cal.set(Calendar.DAY_OF_MONTH,30); System.out.println(' Date with day and month changed : ' + sdf.format(cal.getTime())); } } Пример 14.3.
Результатом будет:
Initialy set date: 2002 August 31 23:03:51 Date with day and month changed: 2002 September 30 23:03:51 Пример 14.4.
Метод add(int field,int delta).
Добавляет некоторое смещение к существующей величине поля. В принципе, то же самое можно сделать с помощью set(f, get(f) + delta).
В случае использования метода add следует помнить о двух правилах:
Если величина поля изменения выходит за диапазон возможных значений данного поля, то производится деление по модулю данной величины, частное суммируется со следующим по старшинству полем.
Если изменяется одно из полей, причем, после изменения младшее по отношению к изменяемому полю принимает некорректное значение, то оно изменяется на