Классы Date, Calendar, TimeZone

Для удобной работы с датой и временем в Java используются классы Date и Calendar. Оба класса находятся в библиотеке java.util. Класс TimeZone используется совместно с классами Calendar и DateFormat

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

На странице рассмотрены следующие классы :

Класс Date

Класс Date хранит время в миллисекундах начиная с 1 января 1970 года. Данный класс имеет конструктор по умолчанию, который возвращает текущее время. Кроме этого можно создать объект Date используя конструктор, который принимает количество миллисекунд начиная с 1 января 1970 года. Для получения этого внутреннего времени используется метод getTime(). Кроме этого уже после создания экземпляра класса можно изменить время с помощью setTime(long date).

Конструкторы класса Date :

Date()
Date(long milliseconds)

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

Методы класса Date:

  • 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 года.

Простой пример использования Date для вывода даты в консоль.

Date date = new Date();

System.out.println(date.toString());

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

Date date = new Date();

long millis = date.getTime();

System.out.println(String.valueOf(millis));

Класс SimpleDateFormat

Для того, чтобы отображать дату и время в удобном формате можно использовать класс SimpleDataFormat :

package ru.test;

import java.util.Date;
import java.text.SimpleDateFormat;

public class Test
{
    public void test()
    {
        Date d = new Date();
        SimpleDateFormat format1 = new SimpleDateFormat("dd.MM.yyyy hh:mm");
        SimpleDateFormat format2 = new SimpleDateFormat("День dd Месяц MM Год yyyy Время hh:mm");
        System.out.println(format1.format(d)); // 25.02.2013 09:03
        System.out.println(format2.format(d)); // День 25 Месяц 02 Год 2013 Время 09:03
    }
}

При создании шаблона представления даты SimpleDateFormat использовались следующие параметры :

  • dd — означает день;
  • MM — месяц;
  • yyyy — год;
  • hh — часы;
  • mm — минуты;

В качестве разделитель можно использовать любой текст.

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

Класс Calendar

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

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

Пример использования классов Calendar и GregorianCalendar

import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;

import java.text.SimpleDateFormat;

public class Test
{
    public void test()
    {
        Calendar c = new GregorianCalendar();              // календарь на текущую дату
        Calendar c2 = new GregorianCalendar(2014, 12, 21); // календарь на 21.12.2014
        c2.add(Calendar.DAY_OF_YEAR, 1);                   // увеличиваем дату на 1 день
        System.out.println(c2.getTime());                  // 22.12.2014
        c2.add(Calendar.DAY_OF_YEAR, -1);                  // уменьшаем дату на 1 день
    }
}

Поля класса Calendar

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

Методы класса Calendar

НаименованиеОписание
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.

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

  • DAY_OF_YEAR — день года (0- 365);
  • DAY_OF_MONTH — день месяца( какой по счету день в месяце 0 — 31);
  • WEEK_OF_MONTH — неделя месяца;
  • WEEK_OF_YEAR — неделя в году;
  • MONTH — номер месяца;
  • Year — номер года;
  • Calendar.ERA — эра.

Пример Calendar, GregorianCalendar

import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;

import java.text.SimpleDateFormat;

public class Test
{
    public void test()
    {
        Calendar c = new GregorianCalendar(2015, 01, 25);          // календарь на 25.01.2015
        System.out.println(c.get(Calendar.MONTH));                 // 01
        System.out.println(c.get(Calendar.YEAR));                  // 2015
        System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println(c.get(Calendar.DAY_OF_WEEK));
        System.out.println(c.get(Calendar.DAY_OF_YEAR));
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
    }
}

Класс GregorianCalendar

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

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

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

boolean isLeapYear(int year)

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

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

GregorianCalendar calendar = new GregorianCalendar(2012, Calendar.DECEMBER, 31);

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

int month = calendar.get(Calendar.MONTH);
System.out.println(month); // вернёт 11

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

GregorianCalendar calendar = new GregorianCalendar(2012, Calendar.DECEMBER, 31);
calendar.set(2013, Calendar.FEBRUARY, 23);
// Убедимся, что возвращает 1 - февраль
System.out.println(calendar.get(Calendar.MONTH));

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

GregorianCalendar calendar = new GregorianCalendar(2012, Calendar.DECEMBER, 31);
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.get(Calendar.MONTH));

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

GregorianCalendar calendar = new GregorianCalendar(year, month, day);
Date hireDay = calendar.getTime();

Класс TimeZone

Класс TimeZone предназначен для совместного использования с классами Calendar и DateFormat. Этот класс абстрактный, поэтому от него порождать объекты нельзя. Вместо этого определен статический метод getDefault(), который возвращает экземпляр наследника TimeZone с настройками, взятыми из операционной системы, под управлением которой работает JVM.

TimeZone имеет статический метод getTimeZone(String ID), используя который можно указать наименование конкретного временного пояса, для которого необходимо получить объект TimeZone.

Набор полей, определяющих возможный набор параметров для getTimeZone, нигде явно не описывается. Но имеется статический метод String[] getAvailableIds(), который возвращает возможные значения для параметра getTimeZone. Так можно определить набор возможных параметров для конкретного временного пояса относительно Гринвича String[] getAvailableIds(int offset).

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

Пример класса TimeZone

import java.util.Arrays;
import java.util.TimeZone;

public class Test
{
    public Test() {}
    String padr(String str,int len) {
        if(len - str.length() > 0){
            char[] buf = new char[len - str.length()];
            Arrays.fill (buf, ' ');
            return str + new String(buf);
        } else {
            return str.substring(0,len);
        }
    }
    public static void main(String[] args)
    {
        TimeZone tz = TimeZone.getDefault();
        int rawOffset = tz.getRawOffset();
        System.out.println("Current TimeZone" + tz.getDisplayName() + tz.getID() + "\n");

        // Display all available TimeZones
        System.out.println("All Available TimeZones \n");
        String[] idArr = TimeZone.getAvailableIDs();
        for(int cnt = 0; cnt < idArr.length; cnt++){
            tz = TimeZone.getTimeZone(idArr[cnt]);
            System.out.println((new Test()).padr(tz.getDisplayName() + tz.getID(),64) + 
                               " raw offset=" + tz.getRawOffset() + 
                               "; hour offset=(" + tz.getRawOffset()/ (1000 * 60 * 60 ) + ")");
        }
      
        // Display all available TimeZones same as for Moscow
        System.out.println("\nTimeZones same as for Moscow \n");
        idArr = TimeZone.getAvailableIDs(rawOffset);
        for(int cnt = 0;cnt < idArr.length;cnt++){
            tz = TimeZone.getTimeZone(idArr[cnt]);
            System.out.println((new Test()).padr(tz.getDisplayName()+ 
                               tz.getID(),64) + " raw offset=" + tz.getRawOffset() + 
                               "; hour offset=(" + tz.getRawOffset()/ (1000 * 60 * 60 ) + ")");
        }
    }
}

В результате работы программы в консоль будет выведена следующая информация (в усеченном виде):

Current TimeZoneMoscow Standard TimeEurope/Moscow

All Available TimeZones 

GMT-12:00Etc/GMT+12                    raw offset=-43200000; hour offset=(-12)
GMT-11:00Etc/GMT+11                    raw offset=-39600000; hour offset=(-11)
Samoa Standard TimePacific/Midway      raw offset=-39600000; hour offset=(-11)
Niue TimePacific/Niue                  raw offset=-39600000; hour offset=(-11)
Samoa Standard TimePacific/Pago_Pago   raw offset=-39600000; hour offset=(-11)
Samoa Standard TimePacific/Samoa       raw offset=-39600000; hour offset=(-11)
Samoa Standard TimeUS/Samoa            raw offset=-39600000; hour offset=(-11)
. . .
TimeZones same as for Moscow 

Azerbaijan TimeAsia/Baku               raw offset=14400000; hour offset=(4)
Gulf Standard TimeAsia/Dubai           raw offset=14400000; hour offset=(4)
Gulf Standard TimeAsia/Muscat          raw offset=14400000; hour offset=(4)
Georgia TimeAsia/Tbilisi               raw offset=14400000; hour offset=(4)
Armenia TimeAsia/Yerevan               raw offset=14400000; hour offset=(4)
GMT+04:00Etc/GMT-4                     raw offset=14400000; hour offset=(4)
Moscow Standard TimeEurope/Moscow      raw offset=14400000; hour offset=(4)
Samara TimeEurope/Samara               raw offset=14400000; hour offset=(4)
Volgograd TimeEurope/Volgograd         raw offset=14400000; hour offset=(4)
Seychelles TimeIndian/Mahe             raw offset=14400000; hour offset=(4)
Mauritius TimeIndian/Mauritius         raw offset=14400000; hour offset=(4)
Reunion TimeIndian/Reunion             raw offset=14400000; hour offset=(4)
Armenia TimeNET                        raw offset=14400000; hour offset=(4)
Moscow Standard TimeW-SU               raw offset=14400000; hour offset=(4)
Наверх
  Рейтинг@Mail.ru