Работа с датами и временем

 

Методы работы с датами и показаниями времени собраны в два класса: Calendar и Date из пакета java.utii.

Объект класса Date хранит число миллисекунд, прошедших с 1 января 1970 г. 00:00:00 по Гринвичу. Это «день рождения» UNIX, он называется » Epoch «.

Класс Date удобно использовать для отсчета промежутков времени в миллисекундах.

Получить текущее число миллисекунд, прошедших с момента Epoch на той машине, где выполняется программа, можно статическим методом

System.currentTimeMillis()

В классе Date два конструктора. Конструктор Date () заносит в создаваемый объект текущее время машины, на которой выполняется программа, по системным часам, а конструктор Date (long miiiisec) — указанное число.

Получить значение, хранящееся в объекте, можно методом long getTime (),

установить новое значение — методом setTimedong newTime).

Три логических метода сравнивают отсчеты времени:

boolean after (long when) — возвращает true , если время when больше данного;

boolean before (long when) — возвращает true , если время when меньше данного;

boolean after (Object when) — возвращает true , если when — объект класca Date и времена совпадают.

Еще два метода, сравнивая отсчеты времени, возвращают отрицательное число типа int , если данное время меньше аргумента when; нуль, если времена совпадают; положительное число, если данное время больше аргумента when :

int compareTo(Date when);

int compareTotobject when) — если when не относится к объектам класса Date , создается исключительная ситуация.

Преобразование миллисекунд, хранящихся в объектах класса Date , в текущее время и дату производится методами класса calendar .

 

Часовой пояс и летнее время

 

Методы установки и изменения часового пояса (time zone) , а также летнего времени DST (Daylight Savings Time), собраны в абстрактном классе Timezone из пакета java.utii. В этом же пакете есть его реализация — подкласс SimpleTimeZone .

В классе simpieTimeZone три конструктора, но чаще всего объект создается статическим методом getoefauito , возвращающим часовой пояс, установленный на машине, выполняющей программу.

В этих классах множество методов работы с часовыми поясами, но в большинстве случаев требуется только узнать часовой пояс на машине, выполняющей программу, статическим методом getDefault () , проверить, осуществляется ли переход на летнее время, логическим методом useDaylightTime () , и установить часовой пояс методом setDef ault (TimeZone zone).

 

Класс Calendar

 

Класс Calendar — абстрактный, в нем собраны общие свойства календарей: юлианского, григорианского, лунного. В Java API пока есть только одна его реализация — подкласс GregorianCalendar.

Поскольку calendar — абстрактный класс, его экземпляры создаются четырьмя статическими методами по заданной локали и/или часовому поясу:

Calendar getlnstance()

Calendar getlnstance(Locale loc)

Calendar getlnstance(TimeZone tz)

Calendar getlnstance(TimeZone tz, Locale loc)

Для работы с месяцами определены целочисленные константы от JANUARY

до DECEMBER , 3 для работы с днями  недели — константы  MONDAY до SUNDAY .

Первый день недели можно узнать методом i nt getFirstDayOfweek(), a установить — методом setFirstDayOfWeek(int day), например:

setFirstDayOfWeek(Calendar.MONDAY)

Остальные методы позволяют просмотреть время и часовой пояс или установить их.

 

Подкласс GregorianCalendar

 

В григорианском календаре две целочисленные константы определяют эры: вс (before Christ) и AD (Anno Domini).

Семь конструкторов определяют календарь по времени, часовому поясу и/или локали:

GregorianCalendar()

GregorianCalendar(int year, int month, int date)

GregorianCalendar(int year, int month, int date, int hour, int minute)

GregorianCalendar(int year, int month, int date,

int hour, int minute, int second)

GregorianCalendar(Locale loc)

GregorianCalendar(TimeZone tz)

GregorianCalendar(TimeZone tz, Locale loc)

После создания объекта следует определить дату перехода с юлианского календаря на григорианский календарь методом setGregorianChange(Date date ). По умолчанию это 15 октября 1582 г. На территории России переход был осуществлен 14 февраля 1918 г., значит, создание объекта greg надо выполнить так:

GregorianCalendar greg = new GregorianCalendar(); greg.setGregorianChange(new

GregorianCalendar(1918, Calendar.FEBRUARY, 14) .getTime ()) ;

Узнать, является ли год високосным в григорианском календаре, можно логическим методом i sLeapYear ().

Метод get (int field) возвращает элемент календаря, заданный аргументом field . Для этого аргумента в классе Calendar определены следующие статические целочисленные константы:

ERA     WEEK_OF_YEAR    DAY_OF_WEEK               SECOND

YEAR    WEEK_OF_MONTH   DAY_OF_WEEK_IN_MONTH      MILLISECOND

MONTH   DAY_OF_YEAR     HOUR_OF_DAY               ZONE_OFFSET

DATE    DAY_OF_MONTH    MINUTE                    DST_OFFSET

Несколько методов set () , использующих эти константы, устанавливают соответствующие значения.

 

Представление даты и времени

 

Различные способы представления дат и показаний времени можно осуществить методами, собранными в абстрактный класс DateFormat и его подкласс SimpleDateFormat ИЗ пакета Java.text.

Класс DateFormat предлагает четыре стиля представления даты и времени:

стиль SHORT представляет дату и время в коротком числовом виде: 27.04.01 17:32; в локали США: 4/27/01 5:32 РМ;

стиль MEDIUM задает год четырьмя цифрами и показывает секунды: 27.04.2001 17:32:45; в локали США месяц представляется тремя буквами;

стиль LONG представляет месяц словом и добавляет часовой пояс: 27 апрель 2001 г. 17:32:45 GMT+03.-00;

стиль FULL в русской локзли таков же, как и стиль LONG ; в локали США добавляется еще день недели.

Есть еще стиль DEFAULT , совпадающий со стилем MEDIUM .

При создании объекта класса simpieDateFormat можно задать в конструкторе шаблон, определяющий какой-либо другой формат, например:

SimpieDateFormat sdf = new SimpieDateFormat(«dd-MM-yyyy hh.iran»); System.out.println(sdf.format(new Date()));

Получим вывод в таком виде: 27-04-2001 17.32.

В шаблоне буква d означает цифру дня месяца, м — цифру месяца, у — цифру года, h — цифру часа, m — цифру минут. Остальные обозначения для шаблона указаны В Документации ПО Классу SimpieDateFormat .

Эти буквенные обозначения можно изменить с помощью класса DateFormatSymbols.

Не во всех локалях можно создать объект класса SimpieDateFormat . В таких случаях используются статические методы getinstanceo класса DateFormat , возвращающие объект класса DateFormat . Параметрами этих методов служат стиль представления даты и времени и, может быть, локаль.

После создания объекта метод format о класса DateFormat возвращает строку с датой и временем, согласно заданному стилю. В качестве аргумента задается объект класса Date .

Например:

System.out.println(«LONG: » + DateFormat.getDateTimelnstance( 

DateFormat. LONG, DateFormat. LONG) . format (new Date ()));

или

System.out.println(«FULL: » + DateFormat.getDateTimelnstance(

DateFormat.FULL,DateFormat.FULL, Locale.US).format(new Date()));