JavaRush /Курсы /Java Syntax Pro /Класс Date

Класс Date

Java Syntax Pro
16 уровень , 1 лекция
Открыта

1. Класс Date и Unix-время

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

Все дело в том, что он очень простой и удобный. И вы как программист обязательно столкнетесь c ним в любом реальном проекте. Использовать его или нет — выбор за вами, но знать его вы обязаны. Поэтому уделите ему несколько минут вашего драгоценного времени.

Чем же так хорош класс Date? Своей простотой.

Класс Date хранит информацию о дате и времени в виде количества миллисекунд, прошедших с 1 января 1970 года. Это очень много миллисекунд, поэтому для их хранения используется тип long.

Интересно

Почему именно с 1970 года? Это так называемое Unix-time: именно так хранит время операционная система Unix, которая является бабушкой всех современных операционных систем.

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

Вот несколько полезных примеров работы с классом Date.


2. Получение текущей даты

Чтобы получить текущее время и дату, достаточно просто создать объект типа Date. Каждый новый объект хранит время (момент) его создания. Выглядит это очень просто:

Date current = new Date();

После выполнения этой команды переменная current будет хранить ссылку на созданный объект Date, который внутри себя будет хранить время его создания — количество миллисекунд, которое прошло с 1 января 1970 года.

Вывод текущей даты на экран

Чтобы вывести на экран текущую дату, просто: а) создайте новый объект Date, б) выведите его на экран с помощью метода System.out.println().

Пример:

Код Вывод на экран
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Вывод на экран расшифровывается так:

Текст Расшифровка
Thursday Четверг
February 21 21 Февраля
14:01:34 часы : минуты : секунды
EET Часовой пояс: East European Time (восточноевропейское время)
2019 Год

3. Задание определенной даты

Как получить текущее время мы разобрались, а как создать объект Date, который бы содержал другую дату или время?

Тут тоже все просто. Чтобы задать определенный день, нужно написать код вида:

Date birthday = new Date(год, месяц, день);

Все просто и очевидно, но есть два нюанса:

  1. Год нужно задавать от 1900.
  2. Месяцы нумеруются с нуля.
Интересно

Это тоже наследие операционной системы Unix: там программисты обозначали год двумя цифрами. Вместо 1977 писали просто 77. Поэтому 77 станет правильным годом, если мы считаем от 1900 года.

Например, я родился 21 марта 1989 года. Март — третий месяц, значит мне нужно написать

Код Вывод на экран
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Месяцы нумеруются с нуля, а дни — нет. Немного странно, да?

Думаем, настоящие программисты должны были пересилить себя и дни месяца тоже нумеровать с нуля. Ох уж эти конформисты 🙂

Задание определенного времени

Задать определенное время тоже достаточно просто: для этого нужно написать команду вида:

Date birthday = new Date(год, месяц, день, час, минуты, секунды);

Часы, минуты и секунды нумеруются с нуля: программист внутри вас должен вздохнуть спокойно.

Пример:

Код Вывод на экран
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Мы задали время 12:15 и дату 4 июня 2005 года. Читается немного сложновато для не программиста, зато работает как надо.


4. Работа с фрагментами даты

Объект Date можно не просто выводить на экран. У него есть методы, которые позволяют получить отдельные фрагменты его даты:

Метод Описание
int getYear()
Возвращает год даты относительно 1900 года.
int getMonth()
Возвращает месяц даты, месяцы нумеруются с нуля
int getDate()
Возвращает день месяца
int getDay()
Возвращает день недели
int getHours()
Возвращает часы
int getMinutes()
Возвращает минуты
int getSeconds()
Возвращает секунды

Пример:

Код Вывод на экран Примечание
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005 год
июнь
день месяца
суббота

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

Метод Описание
void setYear(int year) Меняет год даты. Год задаётся относительно 1900 года.
void setMonth(int month) Меняет месяц даты, месяцы нумеруются с нуля
void setDate(int date) Меняет день месяца
void setHours(int hours) Меняет часы
void setMinutes(int minutes) Меняет минуты
void setSeconds(int seconds) Меняет секунды

5. Миллисекунды

Как мы уже говорили, внутри объекта Date хранится количество миллисекунд, прошедшее с 1 января 1970 года.

Если оно нам нужно, мы можем получить его у объекта Date:

long time = date.getTime();

Метод getTime() возвращает количество миллисекунд, которое хранится внутри объекта Date.

Вы можете не просто получить количество миллисекунд, но и изменить его в существующем объекте:

Date date = new Date();
date.setTime(1117876500000L);

Кстати, можно записать эту конструкцию короче, передав время в объект Date прямо во время его создания:

Date date = new Date(1117876500000L);

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

Если вы хотите сравнить две даты и узнать, какая из них была раньше, для этого есть три способа

Способ первый — просто сравнить количество миллисекунд, которое в них хранится:

if (date1.getTime() < date2.getTime())

Способ второй — использовать метод before() объекта Date:

if (date1.before(date2))

Читается это так: если date1 перед date2, то...

Способ третий — использовать метод after() объекта Date:

if (date2.after(date1))

Читается это так: если date2 после date1, то...


7. Класс DateFormat

Помните, когда мы выводили дату на экран, отображалось что-то типа Thu Feb 21 14:01:34 EET 2019. Вроде бы все правильно, но это скорее отображение даты для программиста. А для пользователя хотелось бы отображать дату попонятнее. Что-нибудь типа Вторник, 21 Февраля.

И без года. Ну или с годом, если надо. В общем, хотелось бы отображать дату разными способами.

Для этого есть специальный класс — SimpleDateFormat.

Пример:

Код
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Вывод на экран
Jun-04-2005

Видите, что программа вывела на экран: Jun-04-2005. Совсем не то, что раньше.

А все дело в том, что мы отображали не сам объект Date, а специальную строку, полученную вызовом метода format() у объекта типа SimpleDateFormat. Но ключевое здесь даже не это.

Когда объект SimpleDateFormat создается, в него в виде параметров мы передаем строку "MMM-dd-YYYY". Вот в этой строке и зашифрован формат даты, который вы увидели в итоге на экране.

  • MMM значит вывести название месяца, сокращенное до трех букв
  • dd — вывести день месяца
  • YYYY — вывести год, состоящий из четырех цифр

Если мы хотим вывести месяц в виде цифр, нужно вместо MMM написать MM: получится строка "MM-dd-YYYY". На экран будет выведено 06-04-2005

Более детально мы разберём этот класс позднее.


8. Метод Date.parse

Класс Date умеет делать еще одну интересную и полезную вещь: получать дату из текстовой строки. Или как говорят программисты, парсить строку.

Для этого у него есть специальный метод — parse(). Выглядит процесс парсинга так:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Кстати, этот же код можно записать более компактно:

Date date = new Date("Jul 06 12:15:00 2019");

Более подробно парсинг строк мы разберем в других лекциях.


Комментарии (300)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сергей Тыщенко Уровень 24
4 октября 2025
Чем же так хорош класс Date? Своей простотой. Ничем он не хорош, класс устарел еще в прошлом веке, с выходом JDK 1.1. Не дай бог на собесе про него ляпнуть. За лекцию дизлайк. Фу такими быть. С актуальным классом первая задача решается в две строки с преобразованием устаревшего типа. И да уровень задачи резко вырастает минимум до среднего ... LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); return localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, new Locale("ru"));
Руслан Уровень 46
2 сентября 2025
без ии никак он сразу сказал что разница в регистре колоссальная!!!
Anonymous #3585174 Уровень 33
17 июля 2025
lIKE
P Уровень 27
14 мая 2025
После темы с потоками - самое то, чтобы перезагрузить мозги)
KemaOnes Уровень 4
15 апреля 2025
Друзья, я прекрасно понимаю тех, кому тяжело изучать программирование. У вас не получается решить задачу? Не можете понять тему? Иногда вы даже не понимаете, что требуется от вас в задаче? Это знакомо не только начинающим, вы такой не один. Если вам что то непонятно и вы тупите, это абсолютно нормально, каждый проходит через это. Это не значит, что вы хуже остальных. Не значит, что вы неспособны изучать программирование. Думаете, что кому то дается это легко и все идет как по маслу? Ошибаетесь! Я начал изучать разработку в 21 год, без ментора, в соло, как и большинство тут. Отмечу сразу данный курс javarush. Тут я узнал много нового, закреплял это все задачками, общался с ребятами с курса. Общение с другими людьми по духу сильно прокачивает вас. Еще я создал тг канал для ребят, которые только начинают свой путь. Там много полезной инфы по питону и джаве, да и целом про Backend. Как легко устроиться на первую работу и море мотивации. Сможете найти себе единоличников, общаться и узнавать новое. Буду рад каждому ) В общем, изучение было тяжелым, я мог сидеть над простой задачей час. И каждый раз ловил себя на мысли, может это все таки не мое и я себя обманываю? Уверен, что вы задавались таким же вопросом. Но я не сдался и продолжал, откладывал тяжелые темы и двигался вперед. Практиковался постоянно, регулярно что то изучал. Самое главное в этом деле, не прокрастинировать. Сейчас я работаю backend разработчиком в нестыдной компании. Потому что я не сдался и шел до конца. Уверен, что и у тебя получится! И запомните, если кажется, что учиться программированию легко, значит вы не учитесь.
Хэйли Эванс Уровень 19
3 апреля 2025
задача на fixdate тупая ппц, метод нифига не универсальный выходит, я битый час искала способ как узнать что реально было введено чтоб не определяло 12 как 0 но это оказывается невозможно, в итоге во второй дате фиксится месяц на ноябрь и это блин оказывается правильное решение, авторов иногда хочется найти и удушить
lusya 1 Уровень 32
15 апреля 2025
Я тоже долго думала, что вообще требуется сделать, десять раз прочитала задание, начала наобум. В итоге все оказалось проще. Конечно с формулировкой заданий иногда беда бывает прям...
Danya Уровень 17
10 мая 2025
на задачу тратить час,мне кажется бесполезным ты лучше потрать на неё 20 минут по уровню сложности если все таки не догадаешься отрой ответ и забери полностью ответ так тоже хорошо укладывается и время экономится за которое ты бы могла уже другую лекцию прочесть
APTEM Уровень 18
22 марта 2025
Всё, что нужно знать об этом классе: Класс Date из java.util считается устаревшим с выхода Java 8 в 2014 году. Вместо него рекомендуется использовать API из пакета java.time, так как: Date и Calendar мутируемые, что делает их неудобными в многопоточных приложениях. Устаревший API плохо читается и неудобен в работе (например, месяцы нумеруются с 0). Новый API (java.time) проще, безопаснее и мощнее. Используется ли Date в Spring? Spring старается использовать java.time. Например: Spring Boot (JPA) поддерживает LocalDate, LocalDateTime, ZonedDateTime вместо Date. Jackson (Spring Boot JSON) умеет работать с java.time. Spring MVC (REST API) обрабатывает LocalDateTime без проблем. Но Date всё ещё встречается в старом коде или в API, где нет другого выбора (например, JDBC до Java 8). Однако при работе с датами в современном Spring-проекте лучше использовать java.time
Мария Уровень 80
12 марта 2025
static String getDayOfWeek(Date date) { return new SimpleDateFormat("EEEE").format(date); } Зачем принимать решение в 1 строку, когда можно задолбать студента догадаться о их логике использования switch'a 😤
Иван Сахаров Уровень 32
15 марта 2025
Это не сработает если по умолчанию в системе стоит не русский язык. Программа выдаст ответ на другом языке и валидатор ругнется. Вот так будет работать.

SimpleDateFormat formatter = new SimpleDateFormat("EEEE",new Locale("ru"));
        String result = formatter.format(date);
        return result;
Но согласен, что правильный ответ через свич оч странно.
golubtsoff Уровень 32
4 мая 2025
Без свича работает. дело в локали. Спасибо.
Юрий Уровень 20
26 февраля 2025
This is JAVAAAAAAA 💪💪💪💪💪💪💪💪💪
Victor Уровень 36
7 февраля 2025
первая задача "Лишь бы не в понедельник" - такой ввод даты тоже работает static Date birthDate = new Date("mar 17 2020")