Класс Java SimpleDateFormat
SimpleDateFormat— это класс в Java, используемый для форматирования и разбора даты и времени, относящийся кjava.text. Он позволяет преобразовывать объекты даты (Date) в строки в определённом формате или разбирать отформатированные строки даты обратно в объекты даты.
Базовое использование
1. Создание объекта SimpleDateFormat
Чтобы использовать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Форматировать объект как строку:
Пример
Date now = new Date();
System.out.println(sdf.format(now));
// Пример вывода: 2023-11-15 Wednesday PM 03:45:22
Разбор даты
Разобрать отформатированную строку даты вDateобъект:
Пример
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экземпляр используется совместно в многопоточной среде, это может вызвать проблемы. Решения:
- Создавать новый экземпляр при каждом использовании (низкая производительность)
- Используйте
ThreadLocalсохранять экземпляр для каждого потока - Использование Java 8
DateTimeFormatter(рекомендуется)
Пример
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.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Он потокобезопасен, работает быстрее, и его рекомендуется использовать в новых проектах.
Итог
SimpleDateFormatИспользуется для форматирования и разбора дат- Задайте формат даты с помощью строк шаблона
- Не является потокобезопасным; необходимо обращать внимание на его использование в многопоточных средах
- Для 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() |
Определяет, является ли разбор нестрогим |