Konverter streng til dato i Java

1. Oversikt

I denne veiledningen, vi vil utforske flere måter å konvertere String gjenstander inn i Dato gjenstander. Vi begynner med det nye Dato tid API - java.time som ble introdusert i Java 8 før vi så på det gamle java.util.Date datatype også brukt til å representere datoer.

For å fullføre, vil vi også se på noen eksterne biblioteker for konvertering ved hjelp av Joda-Time og Apache Commons Lang DateUtils klasse.

2. Konvertering String til LocalDate eller LocalDateTime

LocalDate og LocalDateTime er uforanderlige dato- og tidsobjekter som representerer en dato og sistnevnte en dato og tid. Som standard er Java-datoer i ISO-8601-format, så hvis vi har en streng som representerer en dato og et klokkeslett i dette formatet, så vi kan bruke analysere () API for disse klassene direkte.

Her er litt mer detaljer om denne nye API-en.

2.1. Bruker Parse API

Dato-tid API gir analysere () metoder for parsing a String som inneholder informasjon om dato og klokkeslett. Å konvertere strengobjekter til LocalDate og LocalDateTime objekter, den String må representere en gyldig dato eller tid i henhold til ISO_LOCAL_DATE eller ISO_LOCAL_DATE_TIME.

Ellers kan en DateTimeParseException vil bli kastet ved kjøretid.

I vårt første eksempel, la oss konvertere en String til en java.time.LocalDate:

LocalDate date = LocalDate.parse ("05.05.2018");

En lignende tilnærming til ovennevnte kan brukes til å konvertere en String til en java.time.LocalDateTime:

LocalDateTime dateTime = LocalDateTime.parse ("2018-05-05T11: 50: 55");

Det er viktig å merke seg at både LocalDate og LocalDateTime objekter er agnostiske i tidssonen. Derimot, når vi trenger å håndtere tidssone spesifikk dato og klokkeslett, kan vi bruke ZonedDateTimeanalysere metode direkte for å få en tidssone spesifikk dato:

ZonedDateTime zonedDateTime = ZonedDateTime.parse ("2015-05-05T10: 15: 30 + 01: 00 [Europe / Paris]");

La oss nå se på hvordan vi konverterer strenger med et tilpasset format.

2.2. Bruker Parse API med en tilpasset formatering

Konvertering av en String med et tilpasset datoformat til en Dato objektet er en utbredt operasjon i Java.

For dette formålet, vi bruker DateTimeFormatter klasse som gir mange forhåndsdefinerte formater, og lar oss definere en formatering.

La oss starte med et eksempel på bruk av en av de forhåndsdefinerte formaterne til DateTimeFormatter:

String dateInString = "19590709"; LocalDate date = LocalDate.parse (dateInString, DateTimeFormatter.BASIC_ISO_DATE);

I neste eksempel la oss lage en formatering som bruker formatet “EEE, MMM d yyyy”. Dette formatet spesifiserer tre tegn for ukedagens hele dag, ett siffer som representerer månedsdagen, tre tegn som representerer måneden og fire sifre som representerer året.

Denne formateringen gjenkjenner strenger som “Fre, 3. jan 2003 ″ eller “ons 23. mars 1994“:

String dateInString = "Man 5. mai 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse (dateInString, formatter);

2.3. Vanlige mønstre for dato og tid

La oss se på noen vanlige dato- og tidsmønstre:

  • y - År (1996; 96)
  • M - Måned i året (juli; juli; 07)
  • d - Dag i måned (1-31)
  • E - Dagsnavn i uken (fredag, søndag)
  • en Am / pm markør (AM, PM)
  • H - Time på dag (0-23)
  • h - Time i am / pm (1-12)
  • m - Minutt i time (0-60)
  • s - Andre på minutt (0-60)

For en fullstendig liste over symboler som vi kan bruke til å spesifisere et mønster for parsing, klikk her.

Hvis vi trenger å konvertere java.time går inn i den eldre java.util.Date objekt, les denne artikkelen for mer informasjon.

3. Konvertering String til java.util.Date

Før Java 8 ble Java-dato- og klokkeslettmekanismen levert av de gamle API-ene fra java.util.Date, java.util.Kalender, og java.util.TimeZone klasser som vi noen ganger fortsatt trenger å jobbe med.

La oss se hvordan du konverterer en streng til en java.util.Date gjenstand:

SimpleDateFormat formatter = ny SimpleDateFormat ("dd-MMM-åååå", Språk. ENGLISK); String dateInString = "7-Jun-2013"; Dato dato = formatter.parse (dateInString);

I eksemplet ovenfor, vi trenger først å konstruere en SimpleDateFormat gjenstand ved å sende mønsteret som beskriver dato- og tidsformat.

Deretter må vi påberope oss analysere () metode som passerer datoen String. Hvis den String argumentet som sendes er ikke i samme format som mønsteret da a ParseException vil bli kastet.

3.1. Legge til tidssoneinformasjon til java.util.Date

Det er viktig å merke seg at java.util.Date har ikke noe begrep om tidssone, og representerer bare antall sekunder som har gått siden Unix-epoken - 1970-01-01T00: 00: 00Z.

Men når vi skriver ut Dato objekt direkte, vil det alltid skrives ut med Java-systemets tidssone.

I dette siste eksemplet ser vi på hvordan du formaterer en dato, og legger til tidssoneinformasjon:

SimpleDateFormat formatter = ny SimpleDateFormat ("dd-M-åååå hh: mm: ss a", Lokal.ENGLISK); formatter.setTimeZone (TimeZone.getTimeZone ("Amerika / New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Dato dato = formatter.parse (dateInString); String formattedDateString = formatter.format (dato);

Vi kan også endre JVM-tidssonen programmatisk, men dette anbefales ikke:

TimeZone.setDefault (TimeZone.getTimeZone ("GMT"));

4. Eksterne biblioteker

Nå som vi har god forståelse av hvordan vi konverterer String gjenstander til Dato objekter som bruker de nye og gamle API-ene som tilbys av kjernen Java, la oss ta en titt på noen eksterne biblioteker.

4.1. Joda-Time Library

Et alternativ til kjernen Java Dato og Tid biblioteket er Joda-Time. Selv om forfatterne nå anbefaler brukere å migrere til java.time (JSR-310) hvis dette ikke er mulig så Joda-Time-biblioteket gir et utmerket alternativ for å jobbe med dato og tid. Dette biblioteket gir stort sett alle funksjoner som støttes i Java 8 Dato tid prosjekt.

Artefakten finner du på Maven Central:

 joda-tid joda-tid 2.10 

Her er et raskt eksempel på å jobbe med standarden Dato tid:

DateTimeFormatter formatter = DateTimeFormat.forPattern ("dd / MM / åååå HH: mm: ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse (dateInString, formatter);

La oss også se et eksempel på eksplisitt innstilling av tidssone:

DateTimeFormatter formatter = DateTimeFormat.forPattern ("dd / MM / åååå HH: mm: ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse (dateInString, formatter); DateTime dateTimeWithZone = dateTime.withZone (DateTimeZone.forID ("Asia / Kolkata"));

4.2. Apache Commons Lang - DateUtils

De DateUtils klasse gir mange nyttige verktøy som gjør det lettere å jobbe med arven Kalender og Dato gjenstander.

Commons-lang3-gjenstanden er tilgjengelig fra Maven Central:

 org.apache.commons commons-lang3 3.7 

La oss konvertere en dato String bruker en Array av datomønstre til en java.util.Date:

String dateInString = "07 / 06-2013"; Dato dato = DateUtils.parseDate (dateInString, ny streng [] {"åååå-MM-dd HH: mm: ss", "dd / MM-åååå"});

5. Konklusjon

I denne artikkelen illustrerte vi flere måter å konvertere strenger til forskjellige typer Dato objekter (med og uten tid), både i vanlig Java og ved bruk av eksterne biblioteker.

Hele kildekoden til artikkelen er tilgjengelig på GitHub.