В предыдущих постов мы использовали класс Date, являющийся частью стандартной библиотеки Java. Экземпляр класса Date находится в состоянии, которое отражает конкретный момент времени.
Хотя при использовании класса Date нам необязательно знать о формате даты, отметим, что время представляется количеством миллисекунд(положительным или отрицательным), отсчитанными от фиксированного момента времени, так называемого начала эпохи, то есть от 00:00:00 UTC, 1 января 1970 г. Аббревиатура UTC означает Universal Coordinated Time(универсальное скоординированное время) — научный стандарт времени. UTC применяется наряду с более известным GMT(Greenwich Mean Time — среднее время по Гринвичу).Однако класс Date не очень удобен для работы с датами. Проектировщики библиотеки Java считали, что представление даты, например «December 31, 1999, 23.59.59«, является совершенно произвольным и должно зависеть от календаря. Данное конкретное представление подчиняется григорианскому календарю, самому распространенному календарю в мире. Однако тот же самый момент времени совершенно иначе представляется в китайском или еврейском лунном календаре, не говоря уже о календаре, которым будут пользоваться потенциальные заказчики с Марса.
Проектировщики библиотеки решили отделить вопросы, связанные с отслеживанием моментов времени, от вопросов их представления. Таким образом, стандартная библиотека Java содержит два отдельных класса: класс Date, представляющий момент времени, и класс GregorianCalendar, расширяющий более общий класс Calendar, описывающий свойства календаря в целом.
Теоретически можно расширить класс Calendar и реализовать китайский лунный или марсианский календари. Однако в стандартной библиотеке, кроме григорианского календаря, пока нет никакой другой реализации.
Отделение измерения времени от календарей представляет собой хорошее решение, вполне соответствующее принципу объектно-ориентированного программирования.
Класс Date содержит лишь небольшое количество методов, позволяющих сравнивать два момента времени. Например, методы before и after определяют, предшествует один момент времени другому или следует за ним.
1 2 |
if(today.before(birthday)) System.out.println("Еще есть время купить подарок."); |
На самом деле класс Date имеет такие методы, как getDay(), getMonth() и getYear(), но использовать их без крайней необходимости не рекомендуется. Метод объявляется не рекомендованным к применению(deprecated), когда проектировщики библиотеки решают, что данный метод более не стоит применять в новых программах.
Этим методы были частью класса Date еще до того, как проектировщики библиотеки поняли, что классы, реализующие разные календари, разумнее было бы отделить друг от друга. Сделав это, они пометили методы класса Date как не рекомендованные к применению. Вы можете продолжать использовать их в своих программах, получая при этом предупреждение от компилятора, а еще лучше их не применять совсем, поскольку в будущем они могут быть удалены из библиотеки.
Класс GregorianCalendar содержит гораздо больше методов, чем класс Date. В частности, в нем есть несколько полезных конструкторов. Так, приведенное ниже выражение формирует новый объект, представляющий дату и момент времени, когда он был создан:
1 |
new GregorianCalendar() |
Вы можете создать объект, представляющий полночь даты, указанной как год, месяц и день:
1 |
new GregorianCalendar(1999, 11, 31) |
Довольно странно, что количество месяцев отсчитывается от нуля. Так, число 11 означает декабрь. Для большей ясности можно использовать константу Calendar.DECEMBER:
1 |
new GregorianCalendar(1999, Calendar.DECEMBER, 31) |
Кроме того, посредством конструктора GregorianCalendar можно задать время:
1 |
new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59) |
Чаще всего ссылка на созданный объект присваивается переменной:
1 |
GregorianCalendar deadline = new GregorianCalendar(. . .); |
В классе GregorianCalendar инкапсулированы поля экземпляра, в которых записана указанная дата. Не имея доступа к исходному тексту, невозможно определить, какое представление даты и времени использует этот класс. Разумеется, для программиста, применяющего готовый класс, это совершенно неважно. Важно лишь то, какие методы доступны ему.