Vejledning til DateTimeFormatter

1. Oversigt

I denne vejledning gennemgår vi Java 8 DateTimeFormatter klasse og dens formateringsmønstre. Vi vil også diskutere mulige brugssager til denne klasse.

Vi kan bruge DateTimeFormatter til ensartet formatering af datoer og tidspunkter i en app med foruddefinerede eller brugerdefinerede mønstre.

2. DateTimeFormatter med foruddefinerede forekomster

DateTimeFormatter leveres med flere foruddefinerede dato- / tidsformater der følger ISO- og RFC-standarder. For eksempel kan vi bruge ISO_LOCAL_DATE eksempel for at analysere en dato som f.eks. ‘2018-03-09’:

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

For at analysere en dato med en forskydning kan vi bruge ISO_OFFSET_DATE for at få en output som '2018-03-09-03: 00':

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

De fleste af de foruddefinerede tilfælde af DateTimeFormatter klasse er fokuseret på ISO-8601-standarden. ISO-8601 er en international standard for dato- og tidsformatering.

Der er dog en anden foruddefineret forekomst, der analyserer RFC-1123, Krav til internetværter, udgivet af IETF:

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

Dette uddrag genererer 'Fre, 9. marts 2018 00:00:00 -0300‘.

Nogle gange er vi nødt til at manipulere den dato, vi modtager som en Snor af et kendt format. Vi kan gøre brug af parse () metode:

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

Resultatet af dette kodestykke er et LocalDate repræsentation for 12. marts 2018.

3. DateTimeFormatter med FormatStyle

Nogle gange vil vi måske udskrive datoer på en menneskelig læsbar måde.

I sådanne tilfælde kan vi bruge java.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) værdier med vores 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));

Outputtet fra disse forskellige formateringsstile på samme dato er:

Tirsdag 23. august 2016 23. august 2016 23. august 2016 23/8/16

Vi bruger muligvis også foruddefinerede formateringsformater til dato og klokkeslæt. At bruge FormatStyle med tiden bliver vi nødt til at bruge ZonedDateTime eksempel, ellers DateTimeException vil blive kastet:

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));

Bemærk, at vi har brugt ofLocalizedDateTime () metode til DateTimeFormatter denne gang.

Og det output, vi får, er:

Tirsdag 23. august 2016 13:12:45 EEST 23. august 2016 13:12 EEST 23. august 2016 13:12:45 23/8/16 13:12

Vi kan også bruge FormatStyle for at analysere en dato Snor konvertere det til ZonedDateTime, for eksempel.

Vi kan derefter bruge den parsede værdi til at manipulere dato og tidsvariabel:

ZonedDateTime dateTime = ZonedDateTime.from (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .parse ("Tirsdag 23. august 2016 13:12:45 EET")); System.out.println (dateTime.plusHours (9));

Output af dette uddrag er “2016-08-23T22: 12: 45 + 03: 00 [Europe / Bucharest]”, bemærk at tiden er ændret til “22:12:45”.

4. DateTimeFormatter med brugerdefinerede formater

Foruddefinerede og indbyggede formaterere og stilarter kan dække mange situationer. Imidlertid er vi undertiden nødt til at formatere en dato og tid noget anderledes. Dette er når tilpassede formateringsmønstre kommer i spil.

4.1. DateTimeFormatter til dato

Antag, at vi vil præsentere en java.time.LocalDate objekt ved hjælp af et almindeligt europæisk format som 31.12.2018. For at gøre dette kunne vi kalde fabriksmetoden DateTimeFormatter.ofPattern (“dd.MM.yyyy”).

Dette vil skabe en passende DateTimeFormatter eksempel, som vi kan bruge til at formatere vores dato:

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

Output af dette kodestykke vil være “31.07.2016”.

Der er mange forskellige mønsterbogstaver, som vi kan bruge til at oprette et format til datoer, der passer til vores behov:

 Symbol Betydning Præsentationseksempler ------ ------- ------------ ------- u år 2004; 04-årige år 2004; 04 M / L måned / årstal / tekst 7; 07; Jul; Juli; J d månedsdag nummer 10

Dette er et uddrag af den officielle Java-dokumentation til DateTimeFormatter klasse.

Antallet af bogstaver i mønsterformatet er signifikant.

Hvis vi bruger et to-bogstavsmønster for måneden, får vi en tocifret månedsrepræsentation. Hvis månedstallet er mindre end 10, polstres det med nul. Når vi ikke har brug for den nævnte polstring med nuller, kan vi bruge et ”M” -tegn, der viser januar som “1”.

Hvis vi tilfældigvis bruger et mønster på fire bogstaver i måneden, "MMMM", får vi en "fuld form" -repræsentation. I vores eksempel er det "juli". Et mønster på 5 bogstaver, "MMMMM", får formateren til at bruge den "smalle form". I vores tilfælde ville "J" blive brugt.

Ligeledes kan tilpasset formateringsmønster også bruges til at analysere en streng, der indeholder en dato:

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

Dette kodestykke kontrollerer, om datoen “15.08.2014”Er et af et skudår, og det er det ikke.

4.2. DateTimeFormatter for Time

Der er også mønsterbogstaver, der kan bruges til tidsmønstre:

 Symbol Betydning Præsentationseksempler ------ ------- ------------ ------- H time-of-day (0-23) nummer 0 m minut-minut-nummer 30 s sekund-minut-nummer 55 S brøkdel af sekund-fraktion 978 n nano-sekund-nummer 987654321

Det er ret simpelt at bruge DateTimeFormatter at formatere en java.time.LocalTime eksempel. Antag, at vi vil vise tid (timer, minutter og sekunder) afgrænset med et kolon:

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

Dette vil generere output “17:35:50“.

Hvis vi gerne vil tilføje millisekunder til output, skal vi tilføje “SSS” til mønsteret:

String timeColonPattern = "HH: 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));

Hvilket giver output “17:35:50 329“.

Bemærk, at “HH” er et timedagsmønster, der genererer output på 0-23. Når vi vil vise AM / PM, skal vi bruge små bogstaver "hh" i timevis og tilføje et "a" -mønster:

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

Den genererede output er “17:35:50“.

Vi vil måske analysere tiden Snor med vores brugerdefinerede formater, og kontroller, om det er før middag:

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

Outputtet fra dette sidste uddrag viser, at den givne tid faktisk er før middagstid.

4.3. DateTimeFormatter for tidszoner

Ofte vil vi se en tidszone med en bestemt dato / tidsvariabel. Hvis vi tilfældigvis bruger New York-baseret dato-tid (UTC -4), kan vi bruge "z" mønsterbogstav til tidszone navn:

Streng newYorkDateTimePattern = "dd.MM.åååå 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"))));

Dette genererer output “31.07.2016 14:15 UTC-04: 00”.

Vi kan analysere dato-tidsstrenge med tidszoner, ligesom vi gjorde tidligere:

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

Output af denne kode er "7200" sekunder eller 2 timer, som vi havde forventet.

Vi er nødt til at sikre os, at vi giver et korrekt tidspunkt Snor til parse () metode. Hvis vi videregiver "31.07.2016 14:15" uden en tidszone til zonedFormatter fra det sidste kodestykke får vi en DateTimeParseException.

5. Konklusion

I denne vejledning har vi diskuteret, hvordan du bruger DateTimeFormatter klasse for formatdatoer og -tider. Vi har brugt virkelige eksempler på mønstre, der ofte opstår, når vi arbejder med forekomster af dato og tid.

Vi kan finde ud af mere om Java 8 Dato tid API i tidligere tutorials. Som altid er kildekoden, der bruges i vejledningen, tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found