Guide til DateTimeFormatter

1. Oversikt

I denne opplæringen vil vi gjennomgå Java 8 DateTimeFormatter klasse og dens formateringsmønstre. Vi skal også diskutere mulige brukssaker for denne klassen.

Vi kan bruke DateTimeFormatter for å formatere datoer og klokkeslett jevnt i en app med forhåndsdefinerte eller brukerdefinerte mønstre.

2. DateTimeFormatter med forhåndsdefinerte forekomster

DateTimeFormatter kommer med flere forhåndsdefinerte dato / klokkeslettformater som følger ISO- og RFC-standarder. For eksempel kan vi bruke ISO_LOCAL_DATE forekomst for å analysere en dato som ‘2018-03-09’:

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

For å analysere en dato med en forskyvning, kan vi bruke ISO_OFFSET_DATE for å få en produksjon som ‘2018-03-09-03: 00’:

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

De fleste av de forhåndsdefinerte forekomster av DateTimeFormatter klasse er fokusert på ISO-8601-standarden. ISO-8601 er en internasjonal standard for dato- og tidsformatering.

Det er imidlertid en annen forhåndsdefinert forekomst som analyserer RFC-1123, Krav til Internett-verter, publisert av IETF:

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

Denne kodebiten genererer ‘Fre 9. mars 2018 00:00:00 -0300‘.

Noen ganger må vi manipulere datoen vi får som en String av et kjent format. Vi kan benytte oss av analysere () metode:

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

Resultatet av dette kodebiten er et LocalDate representasjon for 12. mars 2018.

3. DateTimeFormatter med FormatStyle

Noen ganger kan det være lurt å skrive ut datoer på en lesbar måte.

I slike tilfeller kan vi bruke java.time.format.FormatStyle enum (FULL, LANG, MEDIUM, KORT) verdier med våre 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));

Resultatet av disse forskjellige formateringsstiler fra samme dato er:

Tirsdag 23. august 2016 23. august 2016 23. august 2016 23.08.16

Vi kan også bruke forhåndsdefinerte formateringsstiler for dato og klokkeslett. Å bruke FormatStyle med tiden må vi bruke ZonedDateTime eksempel, ellers DateTimeException vil bli 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));

Legg merke til at vi har brukt ofLocalizedDateTime () Metode av DateTimeFormatter denne gangen.

Og produksjonen vi får er:

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

Vi kan også bruke FormatStyle for å analysere en dato String konvertere den til ZonedDateTime, for eksempel.

Vi kan deretter bruke den analyserte verdien til å manipulere dato- og tidsvariabelen:

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

Resultatet av dette kodebiten er “2016-08-23T22: 12: 45 + 03: 00 [Europe / Bucharest]”, legg merke til at tiden er endret til “22:12:45”.

4. DateTimeFormatter med tilpassede formater

Forhåndsdefinerte og innebygde formaterere og stiler kan dekke mange situasjoner. Noen ganger må vi imidlertid formatere en dato og tid noe annerledes. Dette er når egendefinerte formateringsmønstre kommer til spill.

4.1. DateTimeFormatter for dato

Anta at vi vil presentere en java.time.LocalDate objekt i vanlig europeisk format som 31.12.2018. For å gjøre dette kan vi kalle fabrikkmetoden DateTimeFormatter.ofPattern (“dd.MM.yyyy”).

Dette vil skape en passende DateTimeFormatter eksempel som vi kan bruke til å formatere datoen vår:

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

Resultatet av dette kodebiten blir “31.07.2016”.

Det er mange forskjellige mønsterbokstaver som vi kan bruke til å lage et format for datoer som passer våre behov:

 Symbol Betydning Presentasjonseksempler ------ ------- ------------ ------- u år 2004; 04. år-til-år 2004; 04 M / L måned / årstall / tekst 7; 07; Jul; Juli; J dag på måned nummer 10

Dette er et utdrag av den offisielle Java-dokumentasjonen til DateTimeFormatter klasse.

Antall bokstaver i mønsterformatet er betydelig.

Hvis vi bruker et to-bokstavsmønster for måneden, får vi en tosifret månedsrepresentasjon. Hvis månedstallet er mindre enn 10, blir det polstret med null. Når vi ikke trenger den nevnte polstringen med nuller, kan vi bruke et bokstavsmønster “M”, som viser januar som “1”.

Hvis vi tilfeldigvis bruker et firebokstermønster for måneden, "MMMM", så får vi en "fullformat" -representasjon. I vårt eksempel er det "juli". Et 5-bokstavsmønster, "MMMMM", vil gjøre at formateringen bruker "smal form". I vårt tilfelle vil "J" bli brukt.

På samme måte kan tilpasset formateringsmønster også brukes til å analysere en streng som inneholder en dato:

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

Denne kodebiten sjekker om datoen “15.08.2014”Er et av et skuddår, og det er det ikke.

4.2. DateTimeFormatter for Time

Det er også mønsterbokstaver som kan brukes til tidsmønstre:

 Symbol Betydning Presentasjonseksempler ------ ------- ------------ ------- H time-of-day (0-23) nummer 0 m time-of-time nummer 30 s second-of-minute nummer 55 S fraksjon av sekund fraksjon 978 n nano-of-second nummer 987654321

Det er ganske enkelt å bruke DateTimeFormatter å formatere en java.time.LocalTime forekomst. Anta at vi vil vise tid (timer, minutter og sekunder) avgrenset med et kolon:

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

Dette vil gi produksjon “17:35:50“.

Hvis vi vil legge til millisekunder til utgangen, bør vi legge til "SSS" i mønsteret:

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

Som gir resultatet "17:35:50 329“.

Merk at “HH” er et timedagsmønster som genererer produksjonen 0-23. Når vi vil vise AM / PM, bør vi bruke små bokstaver "hh" i flere timer og legge til 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 genererte produksjonen er “17:35:50“.

Det kan være lurt å analysere tiden String med vår tilpassede formatering og sjekk om det er før middagstid:

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

Resultatet av dette siste utdraget viser at den gitte tiden faktisk er før middagstid.

4.3. DateTimeFormatter for tidssoner

Ofte ønsker vi å se en tidssone med en spesifikk dato-tidsvariabel. Hvis vi tilfeldigvis bruker New York-basert dato-tid (UTC -4), kan vi bruke "z" mønsterbokstav for tidssone 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 vil generere utdata “31.07.2016 14:15 UTC-04: 00”.

Vi kan analysere datoens tidsstrenger med tidssoner, akkurat som 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 ());

Resultatet av denne koden er "7200" sekunder, eller 2 timer, som vi forventer.

Vi må sørge for at vi oppgir riktig dato String til analysere () metode. Hvis vi passerer “31.07.2016 14:15”, uten tidssone til soneformatering fra den siste kodebiten får vi en DateTimeParseException.

5. Konklusjon

I denne opplæringen har vi diskutert hvordan du bruker DateTimeFormatter klasse for formatdatoer og klokkeslett. Vi har brukt virkelige eksempler på mønstre som ofte oppstår når vi jobber med forekomster av dato.

Vi kan finne ut mer om Java 8 Dato tid API i tidligere veiledninger. Som alltid er kildekoden som brukes i opplæringen tilgjengelig på GitHub.


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