Bazaprogram.ru

Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java util calendar

Java.util.Calendar Class

Introduction

The java.util.calendar class is an abstract class that provides methods for converting between a specific instant in time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on, and for manipulating the calendar fields, such as getting the date of the next week.Following are the important points about Calendar −

This class also provides additional fields and methods for implementing a concrete calendar system outside the package.

Calendar defines the range of values returned by certain calendar fields.

Class declaration

Following is the declaration for java.util.Calendar class −

Field

Following are the fields for java.util.Calendar class −

static int ALL_STYLES − This is the style specifier for getDisplayNames indicating names in all styles, such as «January» and «Jan».

static int AM − This is the value of the AM_PM field indicating the period of the day from midnight to just before noon.

static int AM_PM − This is the field number for get and set indicating whether the HOUR is before or after noon.

static int APRIL − This is the value of the MONTH field indicating the fourth month of the year in the Gregorian and Julian calendars.

protected boolean areFieldsSet − This is true if fields[] are in sync with the currently set time.

static int AUGUST − This is the value of the MONTH field indicating the eighth month of the year in the Gregorian and Julian calendars.

static int DATE − This is the field number for get and set indicating the day of the month.

static int DAY_OF_MONTH − This is the field number for get and set indicating the day of the month.

static int DAY_OF_WEEK − This is the field number for get and set indicating the day of the week.

static int DAY_OF_WEEK_IN_MONTH − This is the field number for get and set indicating the ordinal number of the day of the week within the current month.

static int DAY_OF_YEAR − This is the field number for get and set indicating the day number within the current year.

static int DECEMBER − This is the value of the MONTH field indicating the twelfth month of the year in the Gregorian and Julian calendars.

static int DST_OFFSET − This is the field number for get and set indicating the daylight savings offset in milliseconds.

static int ERA − This is the field number for get and set indicating the era, e.g., AD or BC in the Julian calendar.

static int FEBRUARY − This is the value of the MONTH field indicating the second month of the year in the Gregorian and Julian calendars.

static int FIELD_COUNT − This is the number of distinct fields recognized by get and set.

protected int[] fields − This is the calendar field values for the currently set time for this calendar.

static int FRIDAY − This is the value of the DAY_OF_WEEK field indicating Friday.

static int HOUR − This is the field number for get and set indicating the hour of the morning or afternoon.

static int HOUR_OF_DAY − This is the field number for get and set indicating the hour of the day.

protected boolean[] isSet − This is the flags which tell if a specified calendar field for the calendar is set.

protected boolean isTimeSet − This is true if then the value of time is valid.

static int JANUARY − This is the value of the MONTH field indicating the first month of the year in the Gregorian and Julian calendars.

static int JULY − This is the value of the MONTH field indicating the seventh month of the year in the Gregorian and Julian calendars.

static int JUNE − This is the value of the MONTH field indicating the sixth month of the year in the Gregorian and Julian calendars.

static int LONG − This is the style specifier for getDisplayName and getDisplayNames indicating a long name, such as «January».

static int MARCH − This is the value of the MONTH field indicating the third month of the year in the Gregorian and Julian calendars.

static int MAY − This is the value of the MONTH field indicating the fifth month of the year in the Gregorian and Julian calendars.

static int MILLISECOND − This is the field number for get and set indicating the millisecond within the second.

static int MINUTE − This is the field number for get and set indicating the minute within the hour.

static int MONDAY − This is the value of the DAY_OF_WEEK field indicating Monday.

static int MONTH − This is the field number for get and set indicating the month.

static int NOVEMBER − This is the value of the MONTH field indicating the eleventh month of the year in the Gregorian and Julian calendars.

static int OCTOBER − This is the value of the MONTH field indicating the tenth month of the year in the Gregorian and Julian calendars.

static int PM − This is the value of the AM_PM field indicating the period of the day from noon to just before midnight.

static int SATURDAY − This is the value of the DAY_OF_WEEK field indicating Saturday.

static int SECOND − This is the field number for get and set indicating the second within the minute.

static int SEPTEMBER − This is the value of the MONTH field indicating the ninth month of the year in the Gregorian and Julian calendars.

static int SHORT − This is the style specifier for getDisplayName and getDisplayNames indicating a short name, such as «Jan».

static int SUNDAY − This is the value of the DAY_OF_WEEK field indicating Sunday.

static int THURSDAY − This is the value of the DAY_OF_WEEK field indicating Thursday.

protected long time − This is the the currently set time for this calendar, expressed in milliseconds after January 1, 1970, 0:00:00 GMT.

static int TUESDAY − This is the value of the DAY_OF_WEEK field indicating Tuesday.

static int UNDECIMBER − This is the value of the MONTH field indicating the thirteenth month of the year.

static int WEDNESDAY − This is the value of the DAY_OF_WEEK field indicating Wednesday.

static int WEEK_OF_MONTH − This is the field number for get and set indicating the week number within the current month.

static int WEEK_OF_YEAR − This is the Field number for get and set indicating the week number within the current year. .

static int YEAR − This is the field number for get and set indicating the year.

static int ZONE_OFFSET − This is the field number for get and set indicating the raw offset from GMT in milliseconds.

>

Sr.No.Constructor & Description1

This constructor constructs a Calendar with the default time zone and locale.

protected Calendar(TimeZone zone, Locale aLocale)

This constructor constructs a calendar with the specified time zone and locale.

>

Sr.No.Method & Description1abstract void add(int field, int amount)

This method adds or subtracts the specified amount of time to the given calendar field, based on the calendar’s rules.

This method returns whether this Calendar represents a time after the time represented by the specified Object.

This method returns whether this Calendar represents a time before the time represented by the specified Object.

This method sets all the calendar field values and the time value (millisecond offset from the Epoch) of this Calendar undefined.

This method sets the given calendar field value and the time value (millisecond offset from the Epoch) of this Calendar undefined.

This method creates and returns a copy of this object.

This method compares the time values (millisecond offsets from the Epoch) represented by two Calendar objects.

This method fills in any unset fields in the calendar fields.

This method converts the current millisecond time value time to calendar field values in fields[].

This method converts the current calendar field values in fields[] to the millisecond time value time.

This method compares this Calendar to the specified Object.

This method returns the value of the given calendar field.

This method returns the maximum value that the specified calendar field could have, given the time value of this Calendar.

This method returns the minimum value that the specified calendar field could have, given the time value of this Calendar.

This method returns an array of all locales for which the getInstance methods of this class can return localized instances.

This method returns the string representation of the calendar field value in the given style and locale.

This method returns a Map containing all names of the calendar field in the given style and locale and their corresponding field values.

This method gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.

This method returns the highest minimum value for the given calendar field of this Calendar instance.

This method gets a calendar using the default time zone and locale.

This method gets a calendar using the default time zone and specified locale.

This method gets a calendar using the specified time zone and default locale.

This method gets a calendar with the specified time zone and locale.

This method returns the lowest maximum value for the given calendar field of this Calendar instance.

This method returns the maximum value for the given calendar field of this Calendar instance.

This method gets what the minimal days required in the first week of the year are; e.g., if the first week is defined as one that contains the first day of the first month of a year, this method returns 1.

This method returns the minimum value for the given calendar field of this Calendar instance.

This method returns a Date object representing this Calendar’s time value (millisecond offset from the Epoch»).

This method returns this Calendar’s time value in milliseconds.

This method gets the time zone.

This method Returns a hash code for this calendar.

This method returns the value of the given calendar field.

This method tells whether date/time interpretation is to be lenient.

This method determines if the given calendar field has a value set, including cases that the value has been set by internal fields calculations triggered by a get method call.

This method adds or subtracts (up/down) a single unit of time on the given time field without changing larger fields.

This method adds the specified (signed) amount to the specified calendar field without changing larger fields.

This method sets the given calendar field to the given value.

This method sets the values for the calendar fields YEAR, MONTH, and DAY_OF_MONTH.

This method sets the values for the calendar fields YEAR, MONTH, DAY_OF_MONTH, HOUR_OF_DAY, and MINUTE.

This method sets the values for the fields YEAR, MONTH, DAY_OF_MONTH, HOUR, MINUTE, and SECOND.

This method sets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.

This method specifies whether or not date/time interpretation is to be lenient.

This method sets what the minimal days required in the first week of the year are; For Example, if the first week is defined as one that contains the first day of the first month of a year, call this method with value.

This method sets this Calendar’s time with the given Date.

This method sets this Calendar’s current time from the given long value.

This method sets the time zone with the given time zone value.

This method return a string representation of this calendar.

Methods inherited

This class inherits methods from the following classes −

Класс Java.util.GregorianCalendar в Java

GregorianCalendar — это конкретный подкласс (тот, который имеет реализацию всех своих унаследованных членов либо из интерфейса, либо из абстрактного класса) Календаря, который реализует наиболее широко используемый григорианский календарь, с которым мы знакомы.

java.util.GregorianCalendar против java.util.Calendar

Основное различие между классами GregorianCalendar и Calendar заключается в том, что класс Calendar, являющийся абстрактным классом, не может быть создан. Таким образом, объект класса Calendar инициализируется как:

Здесь объект с именем cal из класса календаря инициализируется с текущей датой и временем в локали по умолчанию и часовом поясе. Принимая во внимание, что класс GregorianCalendar, являющийся конкретным классом, может быть создан. Таким образом, объект класса GregorianCalendar инициализируется как:

Здесь объект с именем gcal класса GregorianCalendar инициализируется с текущей датой и временем в локали и часовом поясе по умолчанию.

Поля определены:

Конструкторы: существует несколько конструкторов для объектов GregorianCalendar . В широком смысле, конструкторы для GregorianCalendar либо инициализируют объект с указанной пользователем датой и / или временем в локали и часовом поясе по умолчанию , либо инициализируют объект с датой и временем по умолчанию в указанной локали и / или часовом поясе пользователя . Это следующие:

Constructor SignatureDescription
GregorianCalendar()initializes the object with the current date and time in the default locale and time zone
GregorianCalendar(int year, int month, int dayOfMonth)initializes the object with the date-set passed as parameters in the default locale and time zone
GregorianCalendar(int year, int month, int dayOfMonth, int hours, int minutes)initializes the object with the date and time-set passed as parameters in the default locale and time zone
GregorianCalendar(int year, int month, int dayOfMonth, int hours, int minutes, int seconds)initializes the object with the date and more specific time-set passed as parameters in the default locale and time zone
GregorianCalendar(Locale locale)initializes the object with the current date and time in the default time zone and the locale passed as parameters
GregorianCalendar(TimeZone timeZone)initializes the object with the current date and time in the default locale and the time zone passed as parameters
GregorianCalendar(TimeZone timeZone, Locale locale)initializes the object with the current date and time in the locale and the time zone passed as parameters

Методы from () , toZonedDateTime () , getCalendarType () были введены в JDK 8.

// Java-программа для отображения этого класса календаря с
// экземпляр по умолчанию и класс GregorianCalendar
// конструктор по умолчанию в основном совпадает с
// возвращаем григорианский календарь по умолчанию
// дата, время, часовой пояс и локаль

public static void main(String[] args)

// Создание объекта класса Calendar

Calendar cal = Calendar.getInstance();

GregorianCalendar gcal = new GregorianCalendar();

/ * Отображение текущей даты с использованием

System.out.println( «Calendar date: «

/ * Отображение текущей даты с использованием

System.out.print( «Gregorian date: «

> // конец основной функции

Выход:

Пример для демонстрации использования различных конструкторов:
1. Использование конструктора по умолчанию

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarGFG <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса GregorianCalendar

используя конструктор по умолчанию * /

GregorianCalendar gcal = new GregorianCalendar();

// отображение даты, времени, часового пояса и локали

+ «Time Zone: » + gcal.getTimeZone().getDisplayName()

> // конец основной функции

Выход:

2. Передавая год, месяц, день месяца как параметры:

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarGFG <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса GregorianCalendar

указав год, месяц и день месяца * /

GregorianCalendar gcal = new GregorianCalendar( 2018 , 3 , 30 );

// отображение даты, времени, часового пояса и локали

+ «Time Zone: » + gcal.getTimeZone().getDisplayName()

> // конец основной функции

Выход:

3. Через год, месяц, день месяца, час дня, минуты:

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarGFG <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса GregorianCalendar

указав год, месяц, день месяца,

hourOfDay и минуты * /

GregorianCalendar gcal = new GregorianCalendar( 2018 , 3 , 30 , 10 , 21 );

// отображение даты, времени, часового пояса и локали

+ «Time Zone: » + gcal.getTimeZone().getDisplayName()

> // конец основной функции

Выход:

4. Через год, месяц, день месяца, час дня, минуты, секунды:

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarGFG <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса GregorianCalendar

указав год, месяц, день месяца,

hourOfDay, минуты и секунды * /

GregorianCalendar gcal = new GregorianCalendar( 2018 , 3 , 30 , 10 , 21 , 51 );

// отображение даты, времени, часового пояса и локали

+ «Time Zone: » + gcal.getTimeZone().getDisplayName()

> // конец основной функции

Выход:

5. Передав timeZone в качестве параметра:

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarTest <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса TimeZone для создания

объект класса GregorianCalendar для назначения

пользовательский часовой пояс (GMT + 5:30) * /

TimeZone tz = TimeZone.getTimeZone( «GMT+5:30» );

GregorianCalendar gcal = new GregorianCalendar(tz);

// отображение даты, времени, часового пояса и локали

+ «Time Zone: » + gcal.getTimeZone().getDisplayName()

> // конец основной функции

Выход:

6. Передав локаль в качестве параметра:

// Java-программа для демонстрации простого GregorianCalendar
// операции

public class GregorianCalendarTest <

public static void main(String args[])

// объявляем массив для хранения сокращений месяцев

«May» , «Jun» , «Jul» , «Aug» ,

«Sep» , «Oct» , «Nov» , «Dec» >;

// объявляем массив для хранения AM или PM

/ * Создание объекта класса Locale для создания

объект класса GregorianCalendar для назначения

пользовательская локаль (Индия) * /

Locale l = new Locale( «en» , «IN» );

GregorianCalendar gcal = new GregorianCalendar(l);

// отображение даты, времени, часового пояса и локали

Классы Date, Calendar, DateFormat

Класс Date предназначен для работы с текущими датой и временем и позволяет отталкиваться от них для решения своих задач. При выходе новых версий Java часть методов класса была перемещена в классы Calendar и DateFormat.

При импорте выбирайте java.util.Date, а не java.sql.Date.

У класса есть два конструктора:

Первый конструктор без параметров инициализирует объект текущей датой и временем. Во втором конструкторе вы можете указать количество миллисекунд, прошедших с полуночи 1 января 1970 года.

  • boolean after(Date date) — если объект класса Date содержит более позднюю дату, чем указано в параметре, то возвращается true
  • boolean before(Date date) — если объект класса Date содержит более раннюю дату, чем указано в параметре, то возвращается true
  • int compareTo(Date date) — сравнивает даты. Возвращает 0, если совпадают, отрицательное значение — если вызывающая дата более ранняя, положительное значение — если вызывающая дата более поздняя, чем в параметре
  • boolean equals(Object object) — если даты совпадают, то возвращается true
  • long getTime() — возвращает количество миллисекунд, прошедших с полуночи 1 января 1970 года
  • void setTime(long milliseconds) — устанавливает время и дату в виде числа миллисекунд, прошедших с полночи 1 января 1970 года.

Если вы посмотрите документацию, то увидите, что существует множество методов для получения или установки отдельных компонентов времени и даты, например, getMinutes()/setMinutes() и др. Все они являются устаревшими и вместо них следует использовать класс Calendar.

Простой пример вывода даты на экран.

С помощью метода getTime() можно отобразить количество миллисекунд, прошедших с 1 января 1970 года. Обновим пример

Calendar

Абстрактный класс Calendar позволяет преобразовать время в миллисекундах в более удобном виде — год, месяц, день, часы, минуты, секунды. Существуют также подклассы, например, GregorianCalendar.

Переменная типа boolean под именем areFieldsSet указывает, были установлены компоненты времени. Переменная fields — это массив целочисленных значений, содержащий компоненты времени. Переменная isSet — массив типа boolean, указывающий, был ли установлен специфический компонент времени. Переменная time (тип long) содержит текущее время объекта. Переменная isTimeSet (тип boolean) указывает, что было установлено текущее время.

У класса много методов. Вкратце опишем часть из них:

  • abstract void add(int field, int value) — добавляет value к компоненту времени или даты, указанному в параметре field (например, Calendar.HOUR). Чтобы отнять, используйте отрицательное значение.
  • boolean after(Object calendar) — возвращает значение true, если вызывающий объект класса Calendar содержит более позднюю дату, чем calendar.
  • boolean before(Object calendar) — возвращает значение true, если вызывающий объект класса Calendar содержит более раннюю дату, чем calendar.
  • final void clear() — обнуляет все компоненты времени в вызывающем объекте.
  • final void clear(int field) — обнуляет компонент, указанный в параметре field
  • int get(int field) — возвращает значение одного компонента, например, Calendar.MINUTE
  • synchronized static Locale[] getAvailableLocales() — возвращает массив объектов класса Locale, содержащий региональные данные
  • synchronized static Calendar getInstance() — возвращает объект класса Calendar для региональных данных и часового пояса по умолчанию. Есть и другие перегруженные версии.
  • final Date getTime() — возвращает объекта класса Date, содержащий время, эквивалентное вызывающему объекту
  • TimeZone getTimeZone() — возвращает часовой пояс
  • final boolean isSet(int field) — возвращает значение true, если указанный компонент времени указан.
  • void set(int field, int value) — устанавливает компоненты даты или времени. Есть перегруженные версии
  • final void setTime(Date date) — устанавливает различные компоненты даты и времени через объект класса Date
  • void setTimeZone(TimeZone timezone) — устанавливает часовой пояс через объект класса TimeZone

Также в календаре определены много различных констант: AUGUST и другие месяцы, SATURDAY и другие дни недели, HOUR и т.д.

GregorianCalendar

Класс GregorianCalendar является подклассом Calendar, который представляет обычный Григорианский календарь. Метод getInstance() класса Calendar обычно возвращает объект класса GregorianCalendar, инициированный текущей датой и временем согласно региональным настройкам.

У класса есть два поля AD и BC — до нашей эры и наша эра.

Кроме стандартных методов, которые есть в классе Calendar, у GregorianCalendar есть метод isLeapYear() для проверки високосного года.

Если год високосный, то возвращается true.

Отсчёт месяцев идёт от нуля, поэтому декабрь будет одиннадцатым месяцем. Чтобы не путаться с такими случаями, проще использовать понятные константы:

А получать нужные отрезки времени можно через метод get(). Например, узнать, какой месяц содержится в созданной нами дате можно так:

Изменить состояние объекта можно через метод set(). Например, установим новую дату у нашего объекта.

Можно сдвинуть дату на определённый период с помощью метода add(). Отодвинем дату на два месяца.

Методы getTime() и setTime() работают с объектами Date и полезны для преобразования.

TimeZone

Класс TimeZone позволяет работать с часовыми поясами, смещёнными относительно Гринвича, также известного универсальное глобальное время (UTC). Класс также учитывает летнее время.

SimpleTimeZone

Класс SimpleTimeZone — подкласс класса TimeZone и позволяет работать с часовыми поясами в Григорианском календаре.

Класс DateFormat

Класс DateFormat является абстрактным классом, с помощью которого можно форматировать и анализировать показания даты и времени. метод getDateInstance() возвращает экземпляр класса DateFormat, который может форматировать информацию о дате.

Чаще всего используется метод format(), позволяющий вывести дату в нужном формате.

Класс SimpleDateFormat

Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.

Символы форматирования строки

  • A — AM или PM
  • d — день месяца (1-31)
  • D — день в году (1-366)
  • H — часы в формате AM/PM (1-12)
  • K — часы в формате суток (1-24)
  • M — минуты (0-59)
  • S — секунды (0-59)
  • W — неделя в году (1-53)
  • y — год
  • z — часовой пояс

Количество повторений символа определяет способ представления даты. Например, можно указать hh:mm:ss, а можно h:m:s. В первом случае будет отображаться ноль перед цифрой.

Примеры работы с датами и временем можно найти в статье на эту тему.

Пакет java.util

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

Класс Date

Класс Date изначально предоставлял набор функций для работы с датой — для получения текущего года, месяца и т.д. Однако сейчас все перечисленные методы не рекомендованы к использованию и практически всю функциональность для этого предоставляет класс Calendar .

Существует несколько конструкторов класса Date , однако рекомендовано к использованию два:

Второй конструктор принимает в качестве параметра значение типа long , указывающее на количество миллисекунд, прошедших с 1 января 1970 г., 00:00:00 по Гринвичу. Первый конструктор создает экземпляр, соответствующий текущему моменту. Фактически это эквивалентно второму варианту new Date(System.currentTimeMillis()) . Можно уже после создания экземпляра класса Date использовать метод setTime(long time) для того, чтобы задать нужное время.

Для сравнения дат служат методы after(Date date) и before(Date date) , которые возвращают булевское значение, в зависимости от того, выполнено условие или нет. Метод compareTo(Date anotherDate) возвращает значение типа int , которое равно -1 , если дата меньше сравниваемой, 1 — если больше и 0 — если даты равны. Метод toString() возвращает строковое описание даты. Однако для более понятного и удобного преобразования даты в текст рекомендуется пользоваться классом SimpleDateFormat , определенным в пакете java.text .

Классы Calendar и GregorianCalendar

Более развитые средства для работы с датами представляет класс Calendar . Calendar является абстрактным классом. Для различных платформ реализуются конкретные подклассы календаря. На данный момент существует реализация Григорианского календаря — GregorianCalendar . Экземпляр этого класса получается путем вызова статического метода getInstance() , который возвращает экземпляр класса GregorianCalendar . Подклассы класса Calendar должны интерпретировать объект Date по-разному. В будущем предполагается реализовать также лунный календарь, используемый в некоторых странах.

Calendar обеспечивает набор методов, позволяющих манипулировать различными «частями» даты, т.е. получать и устанавливать дни, месяцы, недели и т.д.

Если при задании параметров календаря некоторые параметры упущены, то для них будут использованы значения по умолчанию для начала отсчета, т.е.

Для считывания и установки различных «частей» даты используются методы 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 , то при последовательной установке полей мы получили бы вот такой эффект:

Как мы видим, в данном примере при изменении месяца день месяца остался неизменным и было унаследовано его предыдущее значение. Но поскольку в сентябре 30 дней, дата автоматически была переведена на 1 октября, и когда было бы установлено 30 число, оно относилось бы уже к октябрю. В следующем примере считывание даты не производится, соответственно, ее вычисление не выполняется до тех пор, пока все поля не установлены:

Метод add(int field,int delta).

Добавляет некоторое смещение к существующей величине поля. В принципе, то же самое можно сделать с помощью set(f, get(f) + delta) .

В случае использования метода add следует помнить о двух правилах:

  1. Если величина поля изменения выходит за диапазон возможных значений данного поля, то производится деление по модулю данной величины, частное суммируется со следующим по старшинству полем.
  2. Если изменяется одно из полей, причем, после изменения младшее по отношению к изменяемому полю принимает некорректное значение, то оно изменяется на то, которое максимально близко к «старому».
Метод roll(int field,int delta).

Добавляет некоторое смещение к существующей величине поля и не производит изменения старших полей. Рассмотрим приведенный ранее пример, но с использованием метода roll .

Как видно из результатов работы приведенного выше кода, действие правила 1 изменилось по сравнению с методом add , а правило 2 действует так же.

Класс TimeZone

Класс TimeZone предназначен для совместного использования с классами Calendar и DateFormat . Класс абстрактный, поэтому от него порождать объекты нельзя. Вместо этого определен статический метод getDefault() , который возвращает экземпляр наследника TimeZone с настройками, взятыми из операционной системы, под управлением которой работает JVM. Для того, чтобы указать произвольные параметры, можно воспользоваться статическим методом getTimeZone(String ID) , в качестве параметра которому передается наименование конкретного временного пояса, для которого необходимо получить объект TimeZone . Набор полей, определяющих возможный набор параметров для getTimeZone , нигде явно не описывается. Вместо этого определен статический метод String[] getAvailableIds() , который возвращает возможные значения для параметра getTimeZone . Так можно определить набор возможных параметров для конкретного временного пояса (рассчитывается относительно Гринвича) String[] getAvailableIds(int offset) .

Рассмотрим пример, в котором на консоль последовательно выводятся:

  • временная зона по умолчанию;
  • список всех возможных временных зон;
  • список временных зон, которые совпадают с текущей временной зоной.

Класс SimpleTimeZone

Класс SimpleTimeZone , как потомок TimeZone , реализует его абстрактные методы и предназначен для применения в настройках, использующих Григорианский календарь. В большинстве случаев нет необходимости создавать экземпляр данного класса с помощью конструктора. Вместо этого лучше использовать статические методы, которые возвращают тип TimeZone , рассмотренные в предыдущем параграфе. Единственная, пожалуй, причина для использования конструктора — необходимость задания нестандартных правил перехода на зимнее и летнее время.

В классе SimpleTimeZone определено три конструктора. Рассмотрим наиболее полный с точки зрения функциональности вариант, который, помимо временной зоны, задает летнее и зимнее время.

rawOffset — временное смещение относительно гринвича;

ID — идентификатор временной зоны (см. пред.параграф);

startMonth — месяц перехода на летнее время;

startDay — день месяца перехода на летнее время*;

startDayOfWeek — день недели перехода на летнее время*;

startTime — время перехода на летнее время (указывается в миллисекундах);

endMonth — месяц окончания действия летнего времени;

endDay — день окончания действия летнего времени*;

endDayOfWeek — день недели окончания действия летнего времени*;

endTime — время окончания действия летнего времени (указывается в миллисекундах).

Перевод часов на зимний и летний вариант исчисления времени определяется специальным правительственным указом. Обычно переход на летнее время происходит в 2 часа в последнее воскресенье марта, а переход на зимнее время — в 3 часа в последнее воскресенье октября.

Алгоритм расчета таков:

  • если startDay=1 и установлен день недели, то будет вычисляться первый день недели startDayOfWeek месяца startMonth (например, первое воскресенье);
  • если startDay=-1 и установлен день недели, то будет вычисляться последний день недели startDayOfWeek месяца startMonth (например, последнее воскресенье);
  • если день недели startDayOfWeek установлен в 0 , то будет вычисляться число startDay конкретного месяца startMonth ;
  • для того, чтобы установить день недели после конкретного числа, специфицируется отрицательное значение дня недели. Например, чтобы указать первый понедельник после 23 февраля, используется вот такой набор: startDayOfWeek=-MONDAY, startMonth=FEBRUARY, startDay=23
  • для того, чтобы указать последний день недели перед каким-либо числом, указывается отрицательное значение этого числа и отрицательное значение дня недели. Например, для того, чтобы указать последнюю субботу перед 23 февраля, необходимо задать такой набор параметров: startDayOfWeek=-SATURDAY, startMonth=FEBRUARY, startDay=-23;
  • все вышеперечисленное относится также и к окончанию действия летнего времени.

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

Читать еще:  Java lang math
Ссылка на основную публикацию
Adblock
detector