Класс Java Date
В Java,Dateкласс расположен вjava.utilпакете, и он представляет конкретный момент времени с точностью до миллисекунды.
Класс Date в основном используется для представления информации о дате и времени и является одним из базовых классов для работы с датой и временем в Java.
Следует отметить, что после Java 8 был представлен новый API даты и времени (java.timeпакет). ОнDateболее мощный и проще в использовании, чем класс. Однако во многих унаследованных кодовых базах вы всё ещё увидитеDateиспользование класса.
Основы использования класса Date
Создание объекта Date
Класс Date имеет несколько конструкторов; два наиболее часто используемых способа:
Пример
Date currentDate = new Date();
// Создать объект Date для указанного времени (миллисекунды с 1 января 1970 г. 00:00:00 GMT)
Date specificDate = new Date(1640995200000L); // 1 января 2022 г. 00:00:00 GMT
Часто используемые методы
Класс Date предоставляет несколько часто используемых методов:
Пример
// Получить количество миллисекунд с 1 января 1970 г. 00:00:00 GMT
long timeInMillis = date.getTime();
// Установить время (миллисекунды с 1 января 1970 г. 00:00:00 GMT)
date.setTime(1640995200000L);
// Сравнить две даты
Date anotherDate = new Date();
int result = date.compareTo(anotherDate); // Возвращает -1, если раньше, 0, если равна, 1, если позже
// Проверить, находится ли дата после указанной даты
boolean isAfter = date.after(anotherDate);
// Проверить, находится ли дата перед указанной датой
boolean isBefore = date.before(anotherDate);
Форматирование класса Date
Сам класс Date не предоставляет функциональность форматирования, но мы можем использоватьSimpleDateFormatкласс для форматирования и разбора дат.
Пример форматирования даты
Пример
import java.util.Date;
public class DateFormatExample {
public static void main(String[] args) {
Date date = new Date();
// Создать объект форматирования
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat(yyyy-MM-dd E HH:mm:ss);
// Форматировать дату
String formattedDate1 = sdf1.format(date);
String formattedDate2 = sdf2.format(date);
System.out.println("Формат 1: " + formattedDate1);
System.out.println("Формат 2: " + formattedDate2);
}
}
Результат вывода:
格式1: 2025-05-01 11:33:43 格式2: 2025年05月01日 周四 11时33分43秒
Общие шаблоны формата
| Буква | Значение | Пример |
|---|---|---|
| y | год | yyyy → 2023 |
| M | month | MM → 01, MMM → янв |
| d | day | dd → 05 |
| H | Час (24-часовой формат) | HH → 13 |
| h | Час (12-часовой формат) | hh → 01 |
| m | Минута | mm → 30 |
| s | second | ss → 45 |
| S | Миллисекунда | SSS → 789 |
| E | День недели | E → понедельник |
| a | Маркер AM/PM | a → PM |
综合示例
Ниже приведён простой пример Date:
Пример
import java.text.SimpleDateFormat;
public class DateDemo {
public static void main(String[] args) {
// 1. Создать объект Date, представляющий текущее время
Date now = new Date();
System.out.println("Текущее время: " + now);
// 2. Создать объект Date для конкретного времени (устаревший, не рекомендуется)
@SuppressWarnings("deprecation")
Date oldDate = new Date(123, 4, 15); // 15 мая 2023 (месяц 0-11)
System.out.println("Конкретная дата: " + oldDate);
// 3. Создать объект Date с использованием метки времени (рекомендуется)
Date dateFromTimestamp = new Date(1684131330000L); // 2023-05-15 10:15:30
System.out.println("Создано из метки времени: " + dateFromTimestamp);
// 4. Форматировать вывод даты
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(now);
System.out.println("Форматированная дата: " + formattedDate);
// 5. Разобрать строку в Date
try {
Date parsedDate = sdf.parse("2023-05-15 10:30:00");
System.out.println("Разобранная дата: " + parsedDate);
} catch (Exception e) {
e.printStackTrace();
}
// 6. Получить метку времени
long timestamp = now.getTime();
System.out.println("Метка времени: " + timestamp);
// 7. Сравнить даты
System.out.println("Находится ли текущая дата после dateFromTimestamp: " + now.after(dateFromTimestamp));
System.out.println("Находится ли текущая дата до dateFromTimestamp: " + now.before(dateFromTimestamp));
}
}
Результат вывода:
当前时间: Thu May 01 11:33:05 CST 2025 特定日期: Mon May 15 00:00:00 CST 2023 从时间戳创建: Mon May 15 14:15:30 CST 2023 格式化日期: 2025-05-01 11:33:05 解析后的日期: Mon May 15 10:30:00 CST 2023 时间戳: 1746070385401 now 是否在 dateFromTimestamp 之后: true now 是否在 dateFromTimestamp 之前: false
Ограничения класса Date
Хотя класс Date всё ещё можно использовать во многих случаях, у него есть некоторые очевидные ограничения:
- Не потокобезопасен: объекты Date изменяемы, что может вызывать проблемы в многопоточных средах.
- Плохой дизайн: месяцы начинаются с 0 (0 означает январь), а годы отсчитываются с 1900, что легко может запутать.
- Сложная работа с часовыми поясами: сам класс Date не содержит информации о часовом поясе; для работы с часовыми поясами требуются дополнительные классы.
- Ограниченная функциональность: в нём отсутствует множество распространённых возможностей работы с датами, таких как добавление или вычитание дней, недель и т. д.
Альтернатива: Java 8 Date-Time API
Java 8 представила новый API даты и времени (java.timepackage), который решает многие проблемы класса Date:
Пример
import java.time.format.DateTimeFormatter;
public class NewDateTimeExample {
public static void main(String[] args) {
// Получить текущую дату и время
LocalDateTime now = LocalDateTime.now();
// Формат
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println("Текущее время: " + formattedDateTime);
}
}
Новый API даты и времени предоставляет больше возможностей, например:
LocalDate- Содержит только датуLocalTime- Содержит только времяLocalDateTime- Содержит дату и времяZonedDateTime- Содержит дату, время и часовой пояс- Широкий набор методов работы с датами
Итог
DateЭтот класс — базовый класс в Java для представления даты и времени, но у него есть некоторые ограничения.- Использование
SimpleDateFormatможет форматировать и разбирать строки даты. - В Java 8 и выше рекомендуется использовать новый
java.timeAPI вместоDateкласс. - При сопровождении устаревшего кода понимание
Dateэтого класса всё ещё важно.
Если вы разрабатываете новый проект, рекомендуется отдать предпочтение новому API даты и времени Java 8, так как он более интуитивен, мощный и потокобезопасен.
Ниже приведены распространённые методы класса java.util.Date:
Конструкторы
| Метод | Описание | Примечания |
|---|---|---|
Date() |
Создать объект Date, представляющий текущее время | Устарел, рекомендуется использоватьnew Date()илиCalendar.getInstance() |
Date(long date) |
Создать объект Date на основе указанного количества миллисекунд | Количество миллисекунд отсчитывается от 1 января 1970 г. 00:00:00 GMT |
Часто используемые методы
| Метод | Описание | Примечания |
|---|---|---|
boolean after(Date when) |
Проверяет, наступает ли эта дата после указанной даты | |
boolean before(Date when) |
Проверяет, наступает ли эта дата до указанной даты | |
Object clone() |
Возвращает копию этого объекта | |
int compareTo(Date anotherDate) |
Сравнивает порядок двух дат | |
boolean equals(Object obj) |
Сравнивает две даты на равенство | |
long getTime() |
Возвращает количество миллисекунд с 1 января 1970 г. | |
void setTime(long time) |
Устанавливает этот объект Date, используя значение в миллисекундах | |
String toString() |
Преобразует объект Date в строковое представление | Пример формата: "Tue Jun 22 13:07:00 CST 2021" |
Устаревшие методы (не рекомендуются)
| Метод | Описание | Замена |
|---|---|---|
int getDate() |
Получает день месяца (1-31) | ИспользуйтеCalendar.get(Calendar.DATE) |
int getDay() |
Получить день недели (0-6) | ИспользуйтеCalendar.get(Calendar.DAY_OF_WEEK) |
int getHours() |
Получить час (0-23) | ИспользуйтеCalendar.get(Calendar.HOUR_OF_DAY) |
int getMinutes() |
Получить минуту (0-59) | ИспользуйтеCalendar.get(Calendar.MINUTE) |
int getMonth() |
Получить месяц (0-11) | ИспользуйтеCalendar.get(Calendar.MONTH) |
int getSeconds() |
Получить секунды (0-59) | ИспользуйтеCalendar.get(Calendar.SECOND) |
int getYear() |
Получить год (начиная с 1900) | ИспользуйтеCalendar.get(Calendar.YEAR) |
void setDate(int date) |
Установить день месяца | ИспользуйтеCalendar.set(Calendar.DATE, date) |
void setHours(int hours) |
Установить час | ИспользуйтеCalendar.set(Calendar.HOUR_OF_DAY, hours) |
void setMinutes(int minutes) |
Установить минуту | ИспользуйтеCalendar.set(Calendar.MINUTE, minutes) |
void setMonth(int month) |
Установить месяц | ИспользуйтеCalendar.set(Calendar.MONTH, month) |
void setSeconds(int seconds) |
Установить секунды | ИспользуйтеCalendar.set(Calendar.SECOND, seconds) |
void setYear(int year) |
Установить год | ИспользуйтеCalendar.set(Calendar.YEAR, year) |