1. Клас DateTimeFormatter

Специалният DateTimeFormatterклас си проправя път в API за дата и час. Целта му е да направи възможно най-лесно за програмистите да конвертират дата и час в точния формат, който желаят. И ние сме щастливи да съобщим, че създателите на Java са успели.

Използването му е много лесно. Първо, трябва да създадете DateTimeFormatterклас и да подадете модел, който указва How ще показва датата и часа:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);

Къде dtfе DateTimeFormatterпроменлива. е статичен метод на класа. А шаблонът е низ, който указва модела, който ще се използва за показване на датата и часа.DateTimeFormatter.ofPattern()DateTimeFormatter

Примери

Код Конзолен изход
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


02-22-19

В горния пример използваме ofPattern()метода за създаване на DateTimeFormatterобект въз основа на шаблона. И в следващия ред използваме format()метода за преобразуване на LocalDateTimeобект в низ. Виждате резултата на екрана.

Можете да подадете почти всеки обект от API за дата и час към format()метода.

Статиката ofPattern()също е много проста: тя приема модел като аргумент и връща DateTimeFormatterобект. Най-интересната част се намира в модела.


2. Шаблон за форматиране

Низът, предаден като шаблон, се използва като шаблон при показване на информация. MM се заменя с числото на месеца, dd с деня от месеца, а yy с числото на годината. Регистърът на буквите има meaning.

Пълната table за тези времеви модели е следната:

Писмо Значение
г година
М месец
д ден
з Часа
м Минути
с Секунди
С Хилядни от секундата
н Наносекунди.

Не е особено трудно за запомняне.

Но защо моделът в примера включва повтарящи се букви MM, dd и yy? Е, тук става по-интересно.

Главна идея

Броят на буквите влияе върху дължината на текста. Колкото повече букви има, толкова по-дълъг ще бъде текстът.

Ако буквата H е посочена веднъж, тогава 9 часа ще бъдат показани като 9, но ако буквата H е посочена два пъти подред, тогава 9 часа ще бъдат показани като 09.

Ако буквата y е посочена 2 пъти подред, тогава годината се записва с 2 цифри. Ако се появи 4 пъти подред, тогава се използват 4 цифри.

Ако буквата М е посочена 2 пъти подред, тогава се изписва номерът на месеца. Ако 3 пъти подред, тогава се използва името на месеца (първите му 3 букви). Ако 4 пъти подред, тогава се използва пълното име на месеца.

Пример:

Код Конзолен изход
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


February-22-2019


3. Пълна table с модели

Пълната маса е доста голяма и супер интересна:

модел Вариации на модела Пример Описание
г yy, yyyy 19; 2019 г година
М/Л М, ММ, МММ, ММММ, МММММ 1; 01; Ян; януари; Дж месец
д г, дд 9; 09 ден
з H, HH 2; 02 Часа
м m, mm 3; 03 Минути
с s, ss 5; 05 Секунди
С S, SS, SSS, ... 1; 12; 123 Хилядни от секундата
н н 123456789 Наносекунди
Ж G, GGGG, GGGGG AD; Anno Domini; А; ера
Q/q q, qq, qqq, qqqq 3; 03; Q3; 3-та четвърт Квартал
w w 13 Седмица от годината
У У 3 Седмица от месеца
д ЕЕЕЕ, ЕЕЕЕ, ЕЕЕЕ пн; понеделник; М Ден от седмицата
e/c e, ee, eee, eeee, eeeee 1; 01; пн; понеделник; М Ден от седмицата
а а PM Сутрин or Следобед
ч ч 12 12-часов часовник.
V VV Европа/Хелзинки Часова зона
z z zzzz EET; Източноевропейско стандартно време Часова зона
О О ОООО GMT+2; GMT+02:00 Часова зона

Между другото, това всъщност не е пълната version. Можете да намерите най-пълната version тук .



4. Време за разбор

Класът DateTimeFormatterсъщо е интересен със способността си не само да преобразува дата и час в низ според даден модел, но и да извършва обратната операция!

Разборът на низ е процес на разделянето му на значими токени.

Ето How изглежда:

Код Конзолен изход
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
LocalDate date = LocalDate.parse("February-23-2019", dtf);
System.out.println(date);


February-23-2019

Първо създаваме DateTimeFormatterобект и задаваме модела, който се използва за анализиране.

След това извикваме метода LocalDate.parse()or LocalTime.parse()or LocalDateTime.parse()и предаваме низа, който трябва да бъде анализиран заедно с DateTimeFormatterобекта, който разбира How да анализира подавания текст и Howъв модел трябва да се използва за това.

Друг пример: този път ще анализираме времето.

Код Конзолен изход
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime time = LocalTime.parse("23:59:59", dtf);
System.out.println(time);


23:59:59