Kwert-soft.ru

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

Класс calendar в java

Классы 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. В первом случае будет отображаться ноль перед цифрой.

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

Класс calendar в java

The class also provides additional fields and methods for implementing a concrete calendar system outside the package. Those fields and methods are defined as protected .

Like other locale-sensitive classes, Calendar provides a class method, getInstance , for getting a generally useful object of this type. Calendar ‘s getInstance method returns a Calendar object whose calendar fields have been initialized with the current date and time:

A Calendar object can produce all the calendar field values needed to implement the date-time formatting for a particular language and calendar style (for example, Japanese-Gregorian, Japanese-Traditional). Calendar defines the range of values returned by certain calendar fields, as well as their meaning. For example, the first month of the calendar system has value MONTH == JANUARY for all calendars. Other values are defined by the concrete subclass, such as ERA . See individual field documentation and subclass documentation for details.

Getting and Setting Calendar Field Values

The calendar field values can be set by calling the set methods. Any field values set in a Calendar will not be interpreted until it needs to calculate its time value (milliseconds from the Epoch) or values of the calendar fields. Calling the get , getTimeInMillis , getTime , add and roll involves such calculation.

Читать еще:  Как написать игру на javascript

Leniency

Calendar has two modes for interpreting the calendar fields, lenient and non-lenient. When a Calendar is in lenient mode, it accepts a wider range of calendar field values than it produces. When a Calendar recomputes calendar field values for return by get() , all of the calendar fields are normalized. For example, a lenient GregorianCalendar interprets MONTH == JANUARY , DAY_OF_MONTH == 32 as February 1.

When a Calendar is in non-lenient mode, it throws an exception if there is any inconsistency in its calendar fields. For example, a GregorianCalendar always produces DAY_OF_MONTH values between 1 and the length of the month. A non-lenient GregorianCalendar throws an exception upon calculating its time or calendar field values if any out-of-range field value has been set.

First Week

When setting or getting the WEEK_OF_MONTH or WEEK_OF_YEAR fields, Calendar must determine the first week of the month or year as a reference point. The first week of a month or year is defined as the earliest seven day period beginning on getFirstDayOfWeek() and containing at least getMinimalDaysInFirstWeek() days of that month or year. Weeks numbered . -1, 0 precede the first week; weeks numbered 2, 3. follow it. Note that the normalized numbering returned by get() may be different. For example, a specific Calendar subclass may designate the week before week 1 of a year as week n of the previous year.

Calendar Fields Resolution

If there is any conflict in calendar field values, Calendar gives priorities to calendar fields that have been set more recently. The following are the default combinations of the calendar fields. The most recent combination, as determined by the most recently set single field, will be used.

If there are any calendar fields whose values haven’t been set in the selected field combination, Calendar uses their default values. The default value of each field may vary by concrete calendar systems. For example, in GregorianCalendar , the default of a field is the same as that of the start of the Epoch: i.e., YEAR = 1970 , MONTH = JANUARY , DAY_OF_MONTH = 1 , etc.

Field Manipulation

set(f, value) changes calendar field f to value . In addition, it sets an internal member variable to indicate that calendar field f has been changed. Although calendar field f is changed immediately, the calendar’s time value in milliseconds is not recomputed until the next call to get() , getTime() , getTimeInMillis() , add() , or roll() is made. Thus, multiple calls to set() do not trigger multiple, unnecessary computations. As a result of changing a calendar field using set() , other calendar fields may also change, depending on the calendar field, the calendar field value, and the calendar system. In addition, get(f) will not necessarily return value set by the call to the set method after the calendar fields have been recomputed. The specifics are determined by the concrete calendar class.

Example: Consider a GregorianCalendar originally set to August 31, 1999. Calling set(Calendar.MONTH, Calendar.SEPTEMBER) sets the date to September 31, 1999. This is a temporary internal representation that resolves to October 1, 1999 if getTime() is then called. However, a call to set(Calendar.DAY_OF_MONTH, 30) before the call to getTime() sets the date to September 30, 1999, since no recomputation occurs after set() itself.

add(f, delta) adds delta to field f . This is equivalent to calling set(f, get(f) + delta) with two adjustments:

Add rule 1. The value of field f after the call minus the value of field f before the call is delta , modulo any overflow that has occurred in field f . Overflow occurs when a field value exceeds its range and, as a result, the next larger field is incremented or decremented and the field value is adjusted back into its range.

Add rule 2. If a smaller field is expected to be invariant, but it is impossible for it to be equal to its prior value because of changes in its minimum or maximum after field f is changed or other constraints, such as time zone offset changes, then its value is adjusted to be as close as possible to its expected value. A smaller field represents a smaller unit of time. HOUR is a smaller field than DAY_OF_MONTH . No adjustment is made to smaller fields that are not expected to be invariant. The calendar system determines what fields are expected to be invariant.

In addition, unlike set() , add() forces an immediate recomputation of the calendar’s milliseconds and all fields.

Example: Consider a GregorianCalendar originally set to August 31, 1999. Calling add(Calendar.MONTH, 13) sets the calendar to September 30, 2000. Add rule 1 sets the MONTH field to September, since adding 13 months to August gives September of the next year. Since DAY_OF_MONTH cannot be 31 in September in a GregorianCalendar , add rule 2 sets the DAY_OF_MONTH to 30, the closest possible value. Although it is a smaller field, DAY_OF_WEEK is not adjusted by rule 2, since it is expected to change when the month changes in a GregorianCalendar .

roll(f, delta) adds delta to field f without changing larger fields. This is equivalent to calling add(f, delta) with the following adjustment:

Roll rule. Larger fields are unchanged after the call. A larger field represents a larger unit of time. DAY_OF_MONTH is a larger field than HOUR .

Usage model. To motivate the behavior of add() and roll() , consider a user interface component with increment and decrement buttons for the month, day, and year, and an underlying GregorianCalendar . If the interface reads January 31, 1999 and the user presses the month increment button, what should it read? If the underlying implementation uses set() , it might read March 3, 1999. A better result would be February 28, 1999. Furthermore, if the user presses the month increment button again, it should read March 31, 1999, not March 28, 1999. By saving the original date and using either add() or roll() , depending on whether larger fields should be affected, the user interface can behave as most users will intuitively expect.

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

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

Читать еще:  Java метод append

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);

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

Пакет 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;
  • все вышеперечисленное относится также и к окончанию действия летнего времени.

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

Ссылка на основную публикацию
Adblock
detector