Java SimpleDateFormat – Формат даты Java

Введение

Классы Java SimpleDateFormat и DateFormat используются для форматирования даты. Они в основном используются там, где нам нужно отображать или использовать функциональность даты и времени в Java. Оба этих класса присутствуют в пакете com.text.

Java DateFormat

  • DateFormat используется для форматирования даты в String на основе конкретной локали, которая предоставляется в качестве входных данных.
  • Локаль используется для указания региона и языка, чтобы сделать код более локализованным для пользователя.
  • Способ записи даты отличается в разных регионах мира. Например, 31st Dec 2017 будет записан в Индии как 31-12-2017, но то же самое будет записано в Соединенных Штатах Америки как 12-31-2017.
  • Классы DateFormat не синхронизированы, рекомендуется создавать отдельный экземпляр для каждого потока.

A DateFormat object can be created using the getDateInstance() and getTimeInstance() method of the DateFormat class.

Locale loc = new Locale("en", "US");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, loc);

Примечание: Конструктор Locale(String, String) устарел с версии 19

Locale loc = new Locale.Builder().setLanguage("en").setRegion("US").build();

Метод getDateInstance класса DateFormat требует два входных параметра. Первый параметр определяет используемый DateFormat, а второй параметр – локаль.

Использование format

Класс DateFormat имеет метод format, который отвечает за форматирование.

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

Этот код отформатирует дату на французском (fr) языке и в регионе Франции (FR):

Output
3 janv. 2018

Использование getTimeInstance()

Для создания экземпляра DateFormat мы используем метод getDateInstance().

Для форматирования времени нам нужен экземпляр времени. Мы будем использовать метод getTimeInstance() для получения экземпляра времени.

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

Этот код отформатирует время на французском (fr) языке и в регионе Франции (FR):

Output
11:03:01

Java SimpleDateFormat

SimpleDateFormat похож на DateFormat. Единственное основное различие между ними заключается в том, что SimpleDateFormat можно использовать для форматирования (преобразования Date в String) и для разбора (преобразования String в Date) с поддержкой локали, тогда как у DateFormat нет поддержки локали. DateFormat является абстрактным классом, который предоставляет базовую поддержку для форматирования и разбора даты. SimpleDateFormat – это конкретный класс, который расширяет класс DateFormat.

SimpleDateFormat можно создать с использованием конструктора SimpleDateFormat. Конструктор является параметризованным и требует параметр в виде строки шаблона.

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

Строка pattern – это шаблон, который будет использоваться для форматирования даты, и вывод будет сгенерирован в этом шаблоне как «MM-dd-yyyy».

Шаблоны

Давайте рассмотрим синтаксис шаблона, который следует использовать для форматирования.

Letter for Pattern Date or Time component Examples
G Era designator AD
y Year 2018 (yyyy), 18 (yy)
M Month in year July (MMMM), Jul (MMM), 07 (MM)
w Results in week in year 16
W Results in week in month 3
D Gives the day count in the year 266
d Day of the month 09 (dd), 9(d)
F Day of the week in month 4
E Day name in the week Tuesday, Tue
u Day number of week where 1 represents Monday, 2 represents Tuesday and so on 2
a AM or PM marker AM
H Hour in the day (0-23) 12
k Hour in the day (1-24) 23
K Hour in am/pm for 12 hour format (0-11) 0
h Hour in am/pm for 12 hour format (1-12) 12
m Minute in the hour 59
s Second in the minute 35
S Millisecond in the minute 978
z Timezone Pacific Standard Time; PST; GMT-08:00
Z Timezone offset in hours (RFC pattern) -0800
X Timezone offset in ISO format -08; -0800; -08:00

Некоторые буквы должны использоваться в разном количестве для получения разных результатов, например, для месяца:

Type Pattern Example Output
Full Month MMMM July
Abbreviated Month MMM Jul
Numeric Month MM 07

Примеры

Давайте теперь посмотрим на некоторые примеры различных форматов даты и времени.

Pattern Result
MM/dd/yyyy 01/02/2018
dd-M-yyyy hh:mm:ss 02-1-2018 06:07:59
dd MMMM yyyy 02 January 2018
dd MMMM yyyy zzzz 02 January 2018 India Standard Time
E, dd MMM yyyy HH:mm:ss z Tue, 02 Jan 2018 18:07:59 IST

Используя SimpleDateFormat()

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

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

Этот код выведет “MM-dd-yyyy”:

Output
01-02-2018

Этот шаблон формирует “месяц в году”, “день в месяце” и “год”. Тип символа (и его написание) и количество символов вносят вклад в строку. Месяц представлен двумя цифрами, день – двумя цифрами, а год – четырьмя цифрами.

Этот код отобразил дату “2 января 2018 года” как “01-02-2018”.

Для разбора времени нам нужно изменить шаблон при создании экземпляра SimpleDateFormat.

String pattern = "HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

Этот код выведет “HH:mm:ss.SSSZ”:

Output
13:03:15.454+0530

Этот шаблон формирует “часы”, “минуты”, “секунды”, “миллисекунды” и “смещение часового пояса в часах (шаблон RFC)”.

Этот код отобразил время как “13:03:15.454+0530”.

Используя parse()

Разбор (парсинг) – это преобразование строки в экземпляр java.util.Date. Мы можем разобрать строку в экземпляр даты, используя метод parse() класса SimpleDateFormat. Для разбора строки в дату нам нужен экземпляр класса SimpleDateFormat и строковый шаблон в качестве входных данных для конструктора класса.

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("12-01-2018");
System.out.println(date);

Это выведет дату (12-01-2018) без указания времени:

Output
Sat Dec 01 00:00:00 IST 2018

Теперь давайте посмотрим на пример использования SimpleDateFormat для разбора времени.

String pattern = "HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("22:00:03");
System.out.println(date);

Это выведет время (22:00:03) без указания даты:

Output
Thu Jan 01 22:00:03 IST 1970

Поскольку мы не указали дату, программа считала эпоху датой (т.е. 01-Jan-1970).

Использование Locale

Мы работали с Locale в качестве части DateFormat, и мы видели, что локали используются в зависимости от регионов.

String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, new Locale("fr", "FR"));
Date date = simpleDateFormat.format(new Date());
System.out.println(date);

Этот код будет форматировать текущее время на французском языке (fr) и в регионе Франция (FR):

Output
mardi janvier 2018 14:51:02.354+0530

День и месяц названы на французском языке в зависимости от указанной локали – mardi значит “вторник”, а janvier значит “январь”.

Заключение

В этой статье вы узнали о SimpleDateFormat и DateFormat в Java.

Ссылки:

Source:
https://www.digitalocean.com/community/tutorials/java-simpledateformat-java-date-format