Класс Java SimpleDateFormat

SimpleDateFormat— это класс в Java, используемый для форматирования и разбора даты и времени, относящийся кjava.text. Он позволяет преобразовывать объекты даты (Date) в строки в определённом формате или разбирать отформатированные строки даты обратно в объекты даты.


Базовое использование

1. Создание объекта SimpleDateFormat

Чтобы использоватьSimpleDateFormat, сначала нужно создать экземпляр и указать шаблон формата даты:

Пример

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

public class Main {
    public static void main(String[] args) {
        // Создайте объект SimpleDateFormat и укажите формат
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       
        // Получить текущую дату и время
        Date now = new Date();
       
        // Форматируйте дату как строку
        String formattedDate = sdf.format(now);
        System.out.println("Текущее время: " + formattedDate);
    }
}

Вывод:

当前时间: 2025-05-01 11:35:07

2. Общие символы шаблона формата

Ниже приведены общие символы шаблона формата:

Символ Значение Пример
yyyy Четырёхзначный год 2023
MM Двузначный месяц 01-12
dd Двузначный день 01-31
HH Час в 24-часовом формате 00-23
mm Минута 00-59
ss Секунда 00-59
E День недели Пн, Вт и т. д.
a Маркер AM/PM AM или PM

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

будетDateФорматировать объект как строку:

Пример

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd EEEE a hh:mm:ss");
Date now = new Date();
System.out.println(sdf.format(now));
// Пример вывода: 2023-11-15 Wednesday PM 03:45:22

Разбор даты

Разобрать отформатированную строку даты вDateобъект:

Пример

try {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String dateString = "2023-11-15";
    Date date = sdf.parse(dateString);
    System.out.println(date);
    // Вывод: Wed Nov 15 00:00:00 CST 2023
} catch (ParseException e) {
    e.printStackTrace();
}

Примечание: парсинг может выбросить исключениеParseException, поэтому требуется обработка исключений.


Проблема потокобезопасности

SimpleDateFormatОн не является потокобезопасным. Если один и тот жеSimpleDateFormatэкземпляр используется совместно в многопоточной среде, это может вызвать проблемы. Решения:

  1. Создавать новый экземпляр при каждом использовании (низкая производительность)
  2. ИспользуйтеThreadLocalсохранять экземпляр для каждого потока
  3. Использование Java 8DateTimeFormatter(рекомендуется)

Пример

// Решение с использованием ThreadLocal
private static final ThreadLocal<SimpleDateFormat> dateFormat =
    ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

// Использование
String formattedDate = dateFormat.get().format(new Date());

Альтернатива Java 8

В Java 8 и более поздних версиях рекомендуется использоватьjava.timeклассы в пакете:

Пример

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

public class Main {
    public static void main(String[] args) {
        // Создать форматтер
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
       
        // Получить текущее время и отформатировать его
        LocalDateTime now = LocalDateTime.now();
        String formattedDate = now.format(formatter);
        System.out.println("Текущее время: " + formattedDate);
       
        // Преобразовать строку в дату и время
        LocalDateTime parsedDate = LocalDateTime.parse("2023-11-15 14:30:00", formatter);
        System.out.println("Разобранное время: " + parsedDate);
    }
}

DateTimeFormatterОн потокобезопасен, работает быстрее, и его рекомендуется использовать в новых проектах.


Итог

  1. SimpleDateFormatИспользуется для форматирования и разбора дат
  2. Задайте формат даты с помощью строк шаблона
  3. Не является потокобезопасным; необходимо обращать внимание на его использование в многопоточных средах
  4. Для Java 8 и выше рекомендуется использоватьDateTimeFormatter

ОсвоивSimpleDateFormat, вы можете гибко обрабатывать потребности преобразования различных форматов даты и времени в Java-программах.

Ниже приведены распространённые методы класса java.text.SimpleDateFormat:

Конструкторы

Метод Описание
SimpleDateFormat() Создаёт объект, используя шаблон по умолчанию и символы формата даты локали по умолчанию
SimpleDateFormat(String pattern) Создаёт объект, используя заданный шаблон и символы формата даты локали по умолчанию
SimpleDateFormat(String pattern, Locale locale) Создаёт объект, используя заданный шаблон и символы формата даты для заданной локали

Общие символы шаблона формата

Символ Значение Пример
y год yyyy → 2023
M month MM → 07, MMM → июл, MMMM → июль
d День месяца dd → 15
H Час (0-23) HH → 14
h Час (1-12) hh → 02
m Минута mm → 30
s second ss → 45
S Миллисекунда SSS → 789
E День недели EEE → пн, EEEE → понедельник
a Маркер AM/PM a → PM
z Часовой пояс z → CST, zzzz → Китайское стандартное время

Основные методы

Метод Описание
String format(Date date) Форматирует Date в строку даты/времени
Date parse(String source) Разбирает текст из строки для создания объекта Date
void applyPattern(String pattern) Применяет новый шаблон даты и времени
String toPattern() Возвращает строку шаблона текущей даты и времени
void setTimeZone(TimeZone zone) Устанавливает часовой пояс
TimeZone getTimeZone() Получает часовой пояс
void setLenient(boolean lenient) Устанавливает, является ли разбор нестрогим (по умолчанию true)
boolean isLenient() Определяет, является ли разбор нестрогим
Другие расширения