Класс Java Date

В Java,Dateкласс расположен вjava.utilпакете, и он представляет конкретный момент времени с точностью до миллисекунды.

Класс Date в основном используется для представления информации о дате и времени и является одним из базовых классов для работы с датой и временем в Java.

Следует отметить, что после Java 8 был представлен новый API даты и времени (java.timeпакет). ОнDateболее мощный и проще в использовании, чем класс. Однако во многих унаследованных кодовых базах вы всё ещё увидите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 предоставляет несколько часто используемых методов:

Пример

Date date = new 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.text.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.util.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 всё ещё можно использовать во многих случаях, у него есть некоторые очевидные ограничения:

  1. Не потокобезопасен: объекты Date изменяемы, что может вызывать проблемы в многопоточных средах.
  2. Плохой дизайн: месяцы начинаются с 0 (0 означает январь), а годы отсчитываются с 1900, что легко может запутать.
  3. Сложная работа с часовыми поясами: сам класс Date не содержит информации о часовом поясе; для работы с часовыми поясами требуются дополнительные классы.
  4. Ограниченная функциональность: в нём отсутствует множество распространённых возможностей работы с датами, таких как добавление или вычитание дней, недель и т. д.

Альтернатива: Java 8 Date-Time API

Java 8 представила новый API даты и времени (java.timepackage), который решает многие проблемы класса Date:

Пример

import java.time.LocalDateTime;
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- Содержит дату, время и часовой пояс
  • Широкий набор методов работы с датами

Итог

  1. DateЭтот класс — базовый класс в Java для представления даты и времени, но у него есть некоторые ограничения.
  2. ИспользованиеSimpleDateFormatможет форматировать и разбирать строки даты.
  3. В Java 8 и выше рекомендуется использовать новыйjava.timeAPI вместоDateкласс.
  4. При сопровождении устаревшего кода понимание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)
Другие расширения