Java — форматируем дату и время

Все программисты, изучающие Java рано ли поздно сталкиваются с задачами форматирования даты и времени. За это отвечают специальные классы, основные из которых Date и Calendar. Их можно использовать для вычисления текущего время. Ну а форматировать время можно уже с помощью другого класса –SimpleDateFormat. Об этом и о многом другом вы узнаете ниже.

Конструкторы

Класс Date способен поддерживать два конструктора:

НазваниеКраткое описание
Date()Данный конструктор инициализирует объект с датой и временем на текущий момент.
Date(long millisec)Конструктор принимает аргумент = числу миллисекунд, истекших с полуночи 01.1970 года.

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

НазваниеКраткое описание
boolean after(Date date)Если вызывающий объект date содержит дату, которая является раньше заданной, то возвращает значение true. В ином случае, возвращает значение false.
boolean before(Date date)Если вызывающий объект date содержит более раннюю дату, чем заданная, то класс возвращает значение true. В другом случае класс возвращает значение false.
Object clone()Дублирование вызывающего объекта date.
  
int compareTo(Date date)Класс сравнивает значение вызывающего объекта с этой датой. Если значения равны, то возвращает 0, если объект вызова более ранний, возвращает отрицательное значение, если объект позже даты, то возвращает положительное.
int compareTo(Object obj)Если вызываемый объект имеет класс Date, работает по такому же принципу, как и compareTo(Date). В иной ситуации вызывает ClassCastException.
boolean equals(Object date)Если вызывающий объект date содержит такое же время и дату, которая была указана в date, то возвращает значение true. Иначе класс возвращает значение false.
long getTime()Класс возвращает количество миллисекунд, начиная с 1 января 1970 г.
int hashCode()Класс возвращает хэш-код для объекта вызова.
void setTime(long time)Класс задает дату и времени, затраченное в миллисекундах от 1 января 1970 года.
String toString()Класс преобразует вызывающий объект в строку и возвращает результат.

Как получить текущую дату и время в Java

На самом деле, получить текущую дату и времени в Java не составит особого труда. Например, можно воспользоваться объектом date с методом toString(). Выглядеть это будет следующим образом:

import java.util.Date;

publicclassTest{

publicstaticvoidmain(String args[]){
// Инициализация объекта date
Date date = newDate();

// Вывод текущей даты и времени с использованием toString()
System.out.println(date.toString());
}
}

Сравнение дат

Сравнить даты в Java можно тремя способами:

  1. Функция getTime(). Ее можно использовать, чтобы получить количество миллисекунд, которые прошли с 1 января 1970 года, для обоих объектов, после чего сравнить эти показатели.
  2. Методы before(), after() и equals(). Например, new Date(99, 2, 12).before(new Date (99, 2, 18)). Поскольку 12 число раньше 18 числа месяца, то возвращает значение true.
  3. Метод compareTo(). Он определяется сопоставимым интерфейсом, а затем реализуется по дате.

Форматирование даты с помощью класса SimpleDateFormat

Воспользуйтесь классом для парсинга и форматирования даты для Java. Для форматирования даты и времени он позволяет начать с выбора разнообразных пользовательских шаблонов. Приведем пример:

import java.util.*;
importjava.text.*;

publicclassTest{

publicstaticvoidmain(String args[]){
Date dateNow = newDate();
SimpleDateFormat formatForDateNow = newSimpleDateFormat(«E yyyy.MM.dd ‘и время’ hh:mm:ss a zzz»);

System.out.println(«Текущая дата » + formatForDateNow.format(dateNow));
}
}

Получите результат текущей даты.

Формат-коды SimpleDateFormat

Чтобы задать формат даты и времени в Java, воспользуйтесь регулярными выражениями (строковым шаблоном) с датой и временем. Все буквы ASCII в данной модели зарезервированны как шаблон письма, определяющийся следующим образом:

ОписаниеСимволПример
Обозначение эрыGн.э.
Год из четырех цифрy2020
Номер месяца годаM12
Число месяцаd15
Формат часа в A.M./P.M.(1~12)h8
Формат часа(0~23)H20
Минутыm40
Секундыs30
МиллисекундыS511
День неделиEВт
Номер дня в годуD350
Номер дня недели в месяцеF3 (третье воскресение в этом месяце)
Номер неделя в годуw51
Номер недели в месяцеW3
Маркер A.M./P.M.aAM
Формат часа(1~24)k24
Формат часа в A.M./P.M.(0~11)K0
Часовой поясzFET (Дальневосточноевропейское время)
Выделение для текстаТекст
Одинарная кавычка»

Форматирование даты с помощью метода printf

Также удобно и легко можно сделать формат даты и времени с помощью метода printf. Для этого нужно использовать формат 2-х букв, начиная с t и заканчивая одним из символов в приведенной ниже таблице:

import java.util.Date;

publicclassTest{

publicstaticvoidmain(String args[]){
// Инициализация объекта date
Date date = newDate();

// Вывод текущей даты и времени с использованием toString()
String str = String.format(«Текущая дата и время: %tc», date);

System.out.printf(str);
}
}

Получим следующий результат:

Текущая дата и время: Вт дек1520:55:59 FET 2020

Если бы приходилось несколько раз ставить дату для форматирования каждой части, то это было бы глупо. Поэтому формат строки может говорить про индекс аргумента для форматирования. При этом индекс должен следовать за % и заканчиваться $. Приведем пример:

import java.util.Date;

publicclassTest{

publicstaticvoidmain(String args[]){
// Инициализация объекта date
Date date = newDate();

// Вывод текущей даты с использованием toString()
System.out.printf(«%1$s %2$td %2$tB %2$tY», «Дата:», date);
}
}

Результат будет следующим:

Дата: 15 декабря 2020

К тому же, можно использовать <. Это значит, что такой же аргумент должен применяться снова, как и прошлые спецификации формата. Пример:

import java.util.Date;

publicclassTest{

publicstaticvoidmain(String args[]){
// Инициализация объекта date
Date date = newDate();

// Вывод отформатированной даты (удалите знак = ниже из кода, а то у меня конфликтует этот код с html)
System.out.printf(«%s %te %<=tB %<=tY», «Сегодняшняя дата:», date);
}
}

Получим такой результат:

Сегодняшняя дата: 15 декабря2020

Символы преобразования даты и времени

Вывести время в необходимом в формате на Java можно с помощью специальных символов преобразования:

ОписаниеСимволПример
Текущее время и датаcВт дек 15 20:58:27 FET 2020
Формат даты ISO 8601 (год-месяц-день)F2020-12-15
Американский формат даты (месяц/день/год)D12/19/20
24-часовой формат времениT20:58:25
12-часовой формат времениr20:58:25 AM
24-часовой формат времени без секундR20:58
Текущий год из четырех цифр (с ведущими нулями)Y2020
Последние две цифры года (с ведущими нулями)y20
Первые две цифры года (с ведущими нулями)C20
Полное название месяцаBДекабря
Сокращенное название месяцаbдек
Номер текущего месяца (с ведущими нулями)m12
Номер текущего дня месяца (с ведущими нулями)d15
Номер текущего дня месяца (без ведущих нулей)e15
Полное название текущего дня неделиAВторник
Сокращенное название дня неделиaВт
Количество дней с начала года (с ведущими нулями)j318
Формат часа (с ведущими нулями), от 00 до 23H21
Формат часа (без ведущих нулей), от 0 до 23k21
Формат часа (с ведущими нулями), от 01 до 12I21
Формат часа (без ведущих нулей), от 1 до 12l21
Минуты (с ведущими нулями)M58
Секунды (с ведущими нулями)S25
Миллисекунды (с ведущими нулями)L382
Наносекунды (с ведущими нулями)N775000000
Верхний регистр маркера A.M./P.M.p (%Tp)AM
Нижний регистр маркера A.M./P.M.p (%tp)am
Часовое смещение RFC 822 по GMTz+0300
Часовой поясZFET
Секунды, начиная с 1970-01-01 00:00:00 GMTs1608059134
Миллисекунды, начиная с 1970-01-01 00:00:00 GMTQ16080591341000

Существует много других полезных классов, которые связаны с датой и времени. Чтобы узнать о них подробно, можете прибегнуть к стандартной документации Java.

Как преобразовать строку в дату

SimpleDateForma имеет дополнительные методы, в том числе и parse(), который поможет перевести строку в дату, соответствующую формату, хранящемуся в объекте SimpleDateFormat. Пример:

import java.util.*;
importjava.text.*;

publicclassTest{

publicstaticvoidmain(String args[]){
SimpleDateFormat ft = new SimpleDateFormat («yyyy-MM-dd»);
String str = args.length == 0 ?»2020-12-15″ : args[0];

System.out.print(«Строка » + str + » распаршена как «);
Date parsingDate;
try {
parsingDate = ft.parse(str);
System.out.println(parsingDate);
}catch (ParseException e) {
System.out.println(«Нераспаршена с помощью » + ft);
}
}
}

Результат будет следующим:

Строка 2020-12-15 распаршена как TuDec1500:00:00 FET 2020

Задержка по времени

Можно уменьшить или увеличить время работы программы на любой необходимый период: от 1 мс до срока эксплуатации вашего ПК. Приведем пример, где режим ожидания следующей программы будет 10 секунд:

import java.util.*;

publicclassTest{
publicstaticvoidmain(String args[]){
try {
System.out.println(newDate() + «\n»);
Thread.sleep(10000); // Замораживает весь поток на 10 секунд
System.out.println(newDate() + «\n»);
} catch (Exception e) {
System.out.println(«Получили исключение!»);
}
}
}

Получим следующий результат:

Tu Dec1522:42:16 FET 2020

Tu Dec1522:42:26 FET 2020

Вместо Thread.sleep() лучше использовать TimeUnit():

TimeUnit.NANOSECONDS.sleep(), TimeUnit.MICROSECONDS.sleep(), TimeUnit.MILLISECONDS.sleep(), TimeUnit.SECONDS.sleep(), TimeUnit.MINUTES.sleep(), TimeUnit.HOURS.sleep() или TimeUnit.DAYS.sleep().

Время выполнения программы

Достаточно просто можно узнать время выполнения кода программы посредством System.currentTimeMillis(). Просто запишите вначале программы в переменную значение System.currentTimeMillis(). Соответственно в конце нужно вычесть переменную System.currentTimeMillis() из текущего значения. Приведем пример, где будет измерена скорость работы кода программы, выводящая 10 рандомных чисел на экран:

import java.util.*;

publicclassTest{
publicstaticvoidmain(String args[]){
// Начала отсчета
long start = System.currentTimeMillis();

// Код программы. Получение 10 случайных чисел от 0 до 9 и вывод на экран
for(int i = 1;i <= 10;i++) {
System.out.println(«Случайное число №» + i + «: » + (int)(Math.random() * 10));
}

// Получение и запись в переменную timeWorkCode времени работы программы
long timeWorkCode = System.currentTimeMillis() — start;
// Вывод времени выполнения работы кода на экран
System.out.println(«Скорость выполнения программы: » + timeWorkCode + » миллисекунд»);
}
}

Результат выполнения кода:

Случайное число №1: 0
Случайное число №2: 5
Случайное число №3: 9
Случайное число №4: 9
Случайное число №5: 0
Случайное число №6: 2
Случайное число №7: 0
Случайное число №8: 3
Случайное число №9: 5
Случайное число №10: 9
Скорость выполнения программы: 2 миллисекунд

Разница дат в Java

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

import java.util.*;

publicclassTest{

publicstaticvoidmain(String args[]){
try {
long start = System.currentTimeMillis();
System.out.println(newDate() + «\n»);

Thread.sleep(10000);
System.out.println(newDate() + «\n»);

long end = System.currentTimeMillis();
long diff = end — start;
System.out.println(«Разница между датами: » + diff + » миллисекунд»);
}catch (Exception e) {
System.out.println(«Получили исключение!»);
}
}
}

Результат выполнения кода:

Tu Dec1522:22:10 FET 2020

Tu Dec1522:22:20 FET 2020

Разница между датами: 10081 миллисекунд

Количество дней между датами

Также перед вами может стоять задача – рассчитать количество дней, часов, минут и так далее между датами. Приведем один из способов как найти дни между двумя датами:

import java.util.*;

publicclassTest{

publicstaticvoidmain(String args[]){
String date1 = «01.03.2016»;
String date2 = «01.02.2016»;

SimpleDateFormat format = new SimpleDateFormat(«dd.MM.yyyy»);

Date dateOne = null;
Date dateTwo = null;

try {
dateOne = format.parse(date1);
dateTwo = format.parse(date2);
} catch (Exception e) {
e.printStackTrace();
}

// Количество дней между датами в миллисекундах
long difference = dateOne.getTime() — dateTwo.getTime();
// Перевод количества дней между датами из миллисекунд в дни
int days = (int)(difference / (24 * 60 * 60 * 1000)); // миллисекунды / (24ч * 60мин * 60сек * 1000мс)
// Вывод разницы между датами в днях на экран
System.out.println(days + » дн.»);
}
}

Получим следующий результат:

29 дн.

Класс GregorianCalendar

КлассGregorianCalendar – конкретная реализация класса Calendar, отображающий обыкновенный григорианский календарь.

Метод getInstance() Calendar возвращает GregorianCalendar, который по умолчанию инициализирован текущей датой и временем, локализацией и часовым поясом. GregorianCalendar определяет 2 поля: н. э и до н. э. Это две эпохи, определяющиеся по григорианскому календарю.

Конструкторы для объектов GregorianCalendar:

Название конструктораКраткое описание
GregorianCalendar()Создает GregorianCalendar, используя текущей датой и временем, локализацией и часовым поясом по умолчанию.
GregorianCalendar(int year, int month, int date)Создает значение GregorianCalendar с учетом заданной даты в часовом поясе и локализацией по умолчанию.
GregorianCalendar(int year, int month, int date, int hour, int minute)Конструирует GregorianCalendar в соответствии с заданной датой и временем в часовом поясе и локализацией по умолчанию.
GregorianCalendar(int year, int month, int date, int hour, int minute, int second)Конструирует GregorianCalendar в соответствии с заданной датой и временем в часовом поясе и локализацией по умолчанию.
GregorianCalendar(Locale aLocale)Формирует GregorianCalendar в соответствии с текущим временем в часовом поясе по умолчанию в рамках заданной локализации.
GregorianCalendar(TimeZone zone) Создает GregorianCalendar, основанный на текущем времени в данной зоне времени с локализацией по умолчанию.
GregorianCalendar(TimeZone zone, Locale aLocale)Формирует GregorianCalendar с учетом текущего времени в указанном часовом поясе и локализации.

Полезные методы класса GregorianCalendar:

МетодОписание
void add(int field, int amount)Добавляет указанное количество времени в данное временное поле в соответствии с правилами календаря.
protected void computeFields()Преобразует время по Гринвичу в миллисекунды до значения полей времени.
protected void computeTime()Преобразует значения временного поля Календаря в UTC формате в миллисекундах.
boolean equals(Object obj)Сравнивает этот GregorianCalendar эталонным объектом.
int get(int field)Получает значение для поля заданного времени.
int getActualMaximum(int field)Возвращает максимальное значение, которое это поле может иметь, учитывая текущую дату.
int getActualMinimum(int field)Возвращает минимальное значение, которое это поле может иметь, учитывая текущую дату.
int getGreatestMinimum(int field)Возвращает наибольшее минимальное значение для данного поля, если изменяется.
Date getGregorianChange()Получает изменения даты по григорианскому календарю.
int getLeastMaximum(int field)Возвращает минимально максимальное значение для данного поля, если изменяется.
int getMaximum(int field)Возвращает максимальное значение для данного поля.
Date getTime()Определяет текущее время в соответствии с календарем.
long getTimeInMillis()Получает текущее время по Календарю как длительное.
TimeZone getTimeZone()Возвращает часовой пояс.
int getMinimum(int field)Возвращает минимальное значение для данного поля.
int hashCode()Переопределите хэш-код.
boolean isLeapYear(int year)Определяет, является ли год високосным.
void roll(int field, boolean up)Добавление или вычитание (вверх/вниз) одной единицы времени в данном временном поле без изменений в больших полях.
void set(int field, int value)Устанавливает временное поле с заданным значением.
void set(int year, int month, int date)Задает значения для поля год, месяц и дата.
void set(int year, int month, int date, int hour, int minute)Задает значения для поля год, месяц, дату, час и минуту.
void set(int year, int month, int date, int hour, int minute, int second)Задает значения для поля год, месяц, дату, час, минуту и секунду.
void setGregorianChange(Date date)Устанавливает дату изменения грегорианского календаря.
void setTime(Date date)Устанавливает в соответствии с данным календарем текущее время с заданной датой.
void setTimeInMillis(long millis)Устанавливает в соответствии с данным календарем текущее время от заданного long значения.
void setTimeZone(TimeZone value)Задает часовой пояс со значением заданного часового пояса.
String toString()Возвращает строковое представление календаря.

Надеемся наши примеры вам помогли разобраться с тем, как работать с датой и временем в Java. Если остались вопросы, вы можете задать их в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *