Введение
Классы 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
):
Output3 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
):
Output11: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
”:
Output01-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
”:
Output13: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
) без указания времени:
OutputSat 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
) без указания даты:
OutputThu 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
):
Outputmardi janvier 2018 14:51:02.354+0530
День и месяц названы на французском языке в зависимости от указанной локали – mardi
значит “вторник”, а janvier
значит “январь”.
Заключение
В этой статье вы узнали о SimpleDateFormat
и DateFormat
в Java.
Ссылки:
Source:
https://www.digitalocean.com/community/tutorials/java-simpledateformat-java-date-format