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 можно тремя способами:
- Функция getTime(). Ее можно использовать, чтобы получить количество миллисекунд, которые прошли с 1 января 1970 года, для обоих объектов, после чего сравнить эти показатели.
- Методы before(), after() и equals(). Например, new Date(99, 2, 12).before(new Date (99, 2, 18)). Поскольку 12 число раньше 18 числа месяца, то возвращает значение true.
- Метод 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 | н.э. |
Год из четырех цифр | y | 2020 |
Номер месяца года | M | 12 |
Число месяца | d | 15 |
Формат часа в A.M./P.M.(1~12) | h | 8 |
Формат часа(0~23) | H | 20 |
Минуты | m | 40 |
Секунды | s | 30 |
Миллисекунды | S | 511 |
День недели | E | Вт |
Номер дня в году | D | 350 |
Номер дня недели в месяце | F | 3 (третье воскресение в этом месяце) |
Номер неделя в году | w | 51 |
Номер недели в месяце | W | 3 |
Маркер A.M./P.M. | a | AM |
Формат часа(1~24) | k | 24 |
Формат часа в A.M./P.M.(0~11) | K | 0 |
Часовой пояс | z | FET (Дальневосточноевропейское время) |
Выделение для текста | ‘ | Текст |
Одинарная кавычка | » | ‘ |
Форматирование даты с помощью метода 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 (год-месяц-день) | F | 2020-12-15 |
Американский формат даты (месяц/день/год) | D | 12/19/20 |
24-часовой формат времени | T | 20:58:25 |
12-часовой формат времени | r | 20:58:25 AM |
24-часовой формат времени без секунд | R | 20:58 |
Текущий год из четырех цифр (с ведущими нулями) | Y | 2020 |
Последние две цифры года (с ведущими нулями) | y | 20 |
Первые две цифры года (с ведущими нулями) | C | 20 |
Полное название месяца | B | Декабря |
Сокращенное название месяца | b | дек |
Номер текущего месяца (с ведущими нулями) | m | 12 |
Номер текущего дня месяца (с ведущими нулями) | d | 15 |
Номер текущего дня месяца (без ведущих нулей) | e | 15 |
Полное название текущего дня недели | A | Вторник |
Сокращенное название дня недели | a | Вт |
Количество дней с начала года (с ведущими нулями) | j | 318 |
Формат часа (с ведущими нулями), от 00 до 23 | H | 21 |
Формат часа (без ведущих нулей), от 0 до 23 | k | 21 |
Формат часа (с ведущими нулями), от 01 до 12 | I | 21 |
Формат часа (без ведущих нулей), от 1 до 12 | l | 21 |
Минуты (с ведущими нулями) | M | 58 |
Секунды (с ведущими нулями) | S | 25 |
Миллисекунды (с ведущими нулями) | L | 382 |
Наносекунды (с ведущими нулями) | N | 775000000 |
Верхний регистр маркера A.M./P.M. | p (%Tp) | AM |
Нижний регистр маркера A.M./P.M. | p (%tp) | am |
Часовое смещение RFC 822 по GMT | z | +0300 |
Часовой пояс | Z | FET |
Секунды, начиная с 1970-01-01 00:00:00 GMT | s | 1608059134 |
Миллисекунды, начиная с 1970-01-01 00:00:00 GMT | Q | 16080591341000 |
Существует много других полезных классов, которые связаны с датой и времени. Чтобы узнать о них подробно, можете прибегнуть к стандартной документации 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. Если остались вопросы, вы можете задать их в комментариях.