Gids voor DateTimeFormatter

1. Overzicht

In deze tutorial bespreken we de Java 8 DateTimeFormatter class en zijn opmaakpatronen. We gaan ook mogelijke use-cases voor deze klasse bespreken.

We kunnen gebruiken DateTimeFormatter om datums en tijden in een app uniform op te maken met vooraf gedefinieerde of door de gebruiker gedefinieerde patronen.

2. DateTimeFormatter met vooraf gedefinieerde instanties

DateTimeFormatter wordt geleverd met meerdere voorgedefinieerde datum- / tijdnotaties die voldoen aan ISO- en RFC-normen. We kunnen bijvoorbeeld de ISO_LOCAL_DATE instantie om een ​​datum zoals ‘2018-03-09 'te ontleden:

DateTimeFormatter.ISO_LOCAL_DATE.format (LocalDate.of (2018, 3, 9));

Om een ​​datum met een offset te ontleden, kunnen we gebruiken ISO_OFFSET_DATE om een ​​uitvoer te krijgen als ‘2018-03-09-03: 00 ':

DateTimeFormatter.ISO_OFFSET_DATE.format (LocalDate.of (2018, 3, 9) .atStartOfDay (ZoneId.of ("UTC-3"))));

De meeste van de vooraf gedefinieerde instanties van de DateTimeFormatter klasse zijn gericht op de ISO-8601-norm. ISO-8601 is een internationale standaard voor het formatteren van datum en tijd.

Er is echter een ander vooraf gedefinieerd exemplaar dat RFC-1123 parseert, Requirement for Internet Hosts, gepubliceerd door de IETF:

DateTimeFormatter.RFC_1123_DATE_TIME.format (LocalDate.of (2018, 3, 9) .atStartOfDay (ZoneId.of ("UTC-3")));

Dit fragment genereert ‘Vr 9 mrt 2018 00:00:00 -0300‘.

Soms moeten we de datum die we ontvangen als een Draad van een bekend formaat. We kunnen gebruik maken van de ontleden () methode:

LocalDate.from (DateTimeFormatter.ISO_LOCAL_DATE.parse ("2018-03-09")). PlusDays (3);

Het resultaat van dit codefragment is een LocalDate vertegenwoordiging voor 12 maart 2018.

3. DateTimeFormatter met Formaatstijl

Soms willen we datums afdrukken op een voor mensen leesbare manier.

In dergelijke gevallen kunnen we gebruik maken van java.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) waarden met onze DateTimeFormatter:

LocalDate anotherSummerDay = LocalDate.of (2016, 8, 23); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.FULL) .format (anotherSummerDay)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.LONG) .format (anotherSummerDay)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.MEDIUM) .format (anotherSummerDay)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.SHORT) .format (anotherSummerDay));

De uitvoer van deze verschillende opmaakstijlen van dezelfde datum zijn:

Dinsdag 23 augustus 2016 23 augustus 2016 23 augustus 2016 23/8/16

We kunnen ook vooraf gedefinieerde opmaakstijlen gebruiken voor datum en tijd. Gebruiken Formaatstijl met de tijd zullen we moeten gebruiken ZonedDateTime bijvoorbeeld, anders een DateTimeException zal worden gegooid:

LocalDate anotherSummerDay = LocalDate.of (2016, 8, 23); LocalTime anotherTime = LocalTime.of (13, 12, 45); ZonedDateTime zonedDateTime = ZonedDateTime.of (anotherSummerDay, anotherTime, ZoneId.of ("Europe / Helsinki")); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.LONG) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.SHORT) .format (zonedDateTime));

Merk op dat we hebben gebruikt ofLocalizedDateTime () methode van DateTimeFormatter deze keer.

En de output die we krijgen is:

Dinsdag 23 augustus 2016 13:12:45 EEST 23 augustus 2016 13:12:45 EEST 23 aug. 2016 13:12:45 8/23/16 13:12

We kunnen ook gebruik maken van Formaatstijl om een ​​datum en tijd te ontleden Draad converteren naar ZonedDateTime, bijvoorbeeld.

We kunnen dan de geparseerde waarde gebruiken om de datum- en tijdvariabele te manipuleren:

ZonedDateTime dateTime = ZonedDateTime.from (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .parse ("Dinsdag 23 augustus 2016 1:12:45 PM EET")); System.out.println (dateTime.plusHours (9));

De output van dit fragment is "2016-08-23T22: 12: 45 + 03: 00 [Europa / Boekarest]", merk op dat de tijd is gewijzigd in "22:12:45".

4. DateTimeFormatter met aangepaste formaten

Vooraf gedefinieerde en ingebouwde formatters en stijlen kunnen in veel situaties worden gebruikt. Soms moeten we een datum en tijd echter iets anders opmaken. Dit is wanneer aangepaste opmaakpatronen een rol gaan spelen.

4.1. DateTimeFormatter voor Datum

Stel dat we een java.time.LocalDate object met een normaal Europees formaat zoals 31.12.2018. Om dit te doen, zouden we de fabrieksmethode kunnen noemen DateTimeFormatter.ofPattern ("dd.MM.jjjj").

Dit zal een passend DateTimeFormatter instantie die we kunnen gebruiken om onze datum op te maken:

String EuropeanDatePattern = "dd.MM.yyyy"; DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern (europeanDatePattern); System.out.println (europeanDateFormatter.format (LocalDate.of (2016, 7, 31)));

De output van dit codefragment zal "31.07.2016" zijn.

Er zijn veel verschillende patroonletters die we kunnen gebruiken om een ​​indeling voor datums te maken die aan onze behoeften voldoen:

 Symbool Betekenis Presentatie Voorbeelden ------ ------- ------------ ------- u jaar 2004; 04 j jaartaljaar 2004; 04 M / L maandnummer / tekst 7; 07; Jul; Juli; J d dag-van-maand nummer 10

Dit is een uittreksel van de officiële Java-documentatie naar DateTimeFormatter klasse.

Het aantal letters in het patroonformaat is aanzienlijk.

Als we voor de maand een tweecijferig patroon gebruiken, krijgen we een tweecijferige maandweergave. Als het maandnummer kleiner is dan 10, wordt dit opgevuld met een nul. Als we de genoemde opvulling met nullen niet nodig hebben, kunnen we een eenletterig patroon "M" gebruiken, dat januari zal weergeven als "1".

Als we voor de maand een patroon van vier letters gebruiken, "MMMM", dan krijgen we een weergave in "volledige vorm". In ons voorbeeld is het "juli". Een 5-letterig patroon, "MMMMM", zorgt ervoor dat de formatter de "smalle vorm" gebruikt. In ons geval zou "J" worden gebruikt.

Evenzo kan een aangepast opmaakpatroon ook worden gebruikt om een ​​tekenreeks te ontleden die een datum bevat:

DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern ("dd.MM.yyyy"); System.out.println (LocalDate.from (europeanDateFormatter.parse ("15.08.2014")). IsLeapYear ());

Dit codefragment controleert of de datum "15.08.2014”Is er een van een schrikkeljaar, en dat is het niet.

4.2. DateTimeFormatter voor tijd

Er zijn ook patroonletters die kunnen worden gebruikt voor tijdpatronen:

 Symbool Betekenis Presentatie Voorbeelden ------ ------- ------------ ------- H uur-van-dag (0-23) nummer 0 m minuut-van-uur nummer 30 s seconde-van-minuut nummer 55 S fractie-van-seconde fractie 978 n nano-van-seconde nummer 987654321

Het is vrij eenvoudig te gebruiken DateTimeFormatter om een java.time.LocalTime voorbeeld. Stel dat we de tijd (uren, minuten en seconden) willen laten zien, afgebakend met een dubbele punt:

Tekenreeks timeColonPattern = "UU: mm: ss"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50); System.out.println (timeColonFormatter.format (colonTime));

Dit genereert output “17:35:50“.

Als we milliseconden aan de uitvoer willen toevoegen, moeten we "SSS" aan het patroon toevoegen:

Tekenreeks timeColonPattern = "UU: mm: ss SSS"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50) .plus (329, ChronoUnit.MILLIS); System.out.println (timeColonFormatter.format (colonTime));

Dat geeft de output "17:35:50 329“.

Merk op dat "HH" een uur-van-dagpatroon is dat de output van 0-23 genereert. Als we AM / PM willen weergeven, moeten we urenlang kleine letters "hh" gebruiken en een "a" -patroon toevoegen:

String timeColonPattern = "uu: mm: ss a"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50); System.out.println (timeColonFormatter.format (colonTime));

De gegenereerde output is “17:35:50 uur“.

Misschien willen we de tijd ontleden Draad met onze aangepaste formatter en controleer of het voor 12.00 uur is:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern ("uu: mm: ss a"); System.out.println (LocalTime.from (timeFormatter.parse ("12:25:30 AM")). IsBefore (LocalTime.NOON));

De uitvoer van dit laatste fragment laat zien dat de opgegeven tijd eigenlijk vóór 12.00 uur is.

4.3. DateTimeFormatter voor tijdzones

Vaak willen we een tijdzone zien van een specifieke datum-tijdvariabele. Als we de in New York gebaseerde datum-tijd (UTC -4) gebruiken, kunnen we de patroonletter "z" gebruiken voor de naam van de tijdzone:

String newYorkDateTimePattern = "dd.MM.yyyy HH: mm z"; DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern (newYorkDateTimePattern); LocalDateTime summerDay = LocalDateTime.of (2016, 7, 31, 14, 15); System.out.println (newYorkDateFormatter.format (ZonedDateTime.of (summerDay, ZoneId.of ("UTC-4"))));

Dit zal de output "31.07.2016 14:15 UTC-04: 00" genereren.

We kunnen datum-tijdstrings met tijdzones ontleden, net zoals we eerder deden:

DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern ("dd.MM.yyyy HH: mm z"); System.out.println (ZonedDateTime.from (zonedFormatter.parse ("31.07.2016 14:15 GMT + 02: 00")). GetOffset (). GetTotalSeconds ());

De output van deze code is "7200" seconden, of 2 uur, zoals we zouden verwachten.

We moeten ervoor zorgen dat we een juiste datum en tijd opgeven Draad naar de ontleden () methode. Als we “31.07.2016 14:15” passeren, zonder tijdzone naar de zonedFormatter uit het laatste codefragment krijgen we een DateTimeParseException.

5. Conclusie

In deze zelfstudie hebben we besproken hoe u de DateTimeFormatter klasse voor opmaak datums en tijden. We hebben voorbeeldpatronen uit de praktijk gebruikt die vaak voorkomen wanneer we met datum-tijdinstanties werken.

We kunnen meer te weten komen over Java 8 Datum Tijd API in eerdere tutorials. Zoals altijd is de broncode die in de tutorial wordt gebruikt, beschikbaar op GitHub.