Avatar ·

Как получить текущую дату и время в Java (современные способы)

Всем привет! Я только начал изучать Java и столкнулся с такой, казалось бы, простой задачей: мне нужно получить текущую дату и время в программе. Например, я пишу небольшое приложение для заметок и хочу, чтобы каждая заметка автоматически сохраняла timestamp — момент её создания. Я погуглил и нашёл кучу разных вариантов: `new Date()`, `System.currentTimeMillis()`, `Calendar.getInstance()`. Попробовал `new Date()` — вроде работает, но выводит что-то странное вроде "Fri Jan 10 14:23:05 MSK 2025". А мне нужно, например, "10.01.2025 14:23:05" или "2025-01-10T14:23:05". Потом я прочитал, что старые классы `Date` и `Calendar` считаются устаревшими (deprecated) и не рекомендуются к использованию. Якобы в Java 8 появился новый API для работы с датами. Но как им пользоваться? Я попробовал написать: ```java import java.time.LocalDateTime; LocalDateTime now = LocalDateTime.now(); System.out.println(now); ``` Выводит "2025-01-10T14:23:05.123456". Уже лучше, но мне нужно отформатировать под свой формат. Как это сделать? И вообще, какой способ считается правильным и современным в 2025 году? Подскажите, пожалуйста, с примерами кода. Заранее спасибо! <<>>

Современный подход: Java Time API (Java 8+)

Начиная с Java 8, правильным способом работы с датами и временем является пакет java.time. Он решает все проблемы старых классов (Date, Calendar, SimpleDateFormat) — потокобезопасность, понятный API, поддержка часовых поясов.

Вот основные классы для получения текущего момента:

  • LocalDate.now() — только дата (2025-01-10)
  • LocalTime.now() — только время (14:23:05.123)
  • LocalDateTime.now() — дата и время без часового пояса
  • ZonedDateTime.now() — дата и время с часовым поясом
  • Instant.now() — момент в UTC (для машинного времени)

Форматирование даты и времени

Для вывода в нужном формате используйте DateTimeFormatter:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CurrentDateTimeExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        // Формат: 10.01.2025 14:23:05
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
        String formatted1 = now.format(formatter1);
        System.out.println("Формат 1: " + formatted1);
        
        // Формат: 2025-01-10T14:23:05 (ISO)
        DateTimeFormatter formatter2 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        String formatted2 = now.format(formatter2);
        System.out.println("Формат 2: " + formatted2);
        
        // Формат: 10 января 2025 года, 14:23
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("d MMMM yyyy 'года,' HH:mm");
        String formatted3 = now.format(formatter3);
        System.out.println("Формат 3: " + formatted3);
    }
}

Список наиболее полезных символов форматирования:

  • yyyy — год (4 цифры)
  • MM — месяц (01-12)
  • dd — день месяца (01-31)
  • HH — часы (00-23)
  • mm — минуты (00-59)
  • ss — секунды (00-59)
  • SSS — миллисекунды

Работа с часовыми поясами

Если вам нужно учитывать часовой пояс пользователя:

import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class TimeZoneExample {
    public static void main(String[] args) {
        // Текущее время в Москве
        ZonedDateTime moscowTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
        System.out.println("Москва: " + moscowTime.format(
            DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z")
        ));
        
        // Текущее время в Нью-Йорке
        ZonedDateTime nyTime = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println("Нью-Йорк: " + nyTime.format(
            DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z")
        ));
        
        // UTC время
        ZonedDateTime utcTime = ZonedDateTime.now(ZoneId.of("UTC"));
        System.out.println("UTC: " + utcTime.format(
            DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")
        ));
    }
}

Для заметок: сохраняем timestamp

В вашем приложении для заметок лучше всего сохранять Instant (UTC) в базу данных, а форматировать уже при отображении:

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class NoteTimestampExample {
    public static void main(String[] args) {
        // Сохраняем момент создания
        Instant createdAt = Instant.now();
        
        // При отображении форматируем под пользователя
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")
            .withZone(ZoneId.of("Europe/Moscow"));
        String displayTime = formatter.format(createdAt);
        
        System.out.println("Заметка создана: " + displayTime);
    }
}

Важно: Все классы java.time являются immutable (неизменяемыми) и потокобезопасными. Это значит, что их можно безопасно использовать в многопоточных приложениях, в отличие от старого SimpleDateFormat.

<<>>

Альтернативный подход: использование старого API (для legacy-кода)

Если вы работаете с проектом, где ещё используется Java 7 или ниже, или вы поддерживаете старый код с java.util.Date, то можно использовать следующий подход:

import java.text.SimpleDateFormat;
import java.util.Date;

public class OldWayExample {
    public static void main(String[] args) {
        Date now = new Date();
        
        // Форматирование с помощью SimpleDateFormat
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
        String formatted = sdf.format(now);
        
        System.out.println("Текущая дата и время: " + formatted);
    }
}

Недостатки этого подхода:

  • SimpleDateFormat не потокобезопасен — при использовании из нескольких потоков могут быть ошибки
  • Класс Date имеет много deprecated методов (например, getYear(), getMonth())
  • Сложно работать с часовыми поясами и операциями (прибавление дней, месяцев)

Когда это может пригодиться:

  • В проектах, которые ещё не перешли на Java 8+
  • При работе с библиотеками, которые возвращают Date или Calendar
  • Для быстрой отладки в старых средах

Но если у вас есть возможность, всегда используйте java.time — это современный, безопасный и удобный API.