Konverter streng til dato i Java

1. Oversigt

I denne vejledning vi undersøger flere måder at konvertere på Snor genstande ind i Dato genstande. Vi starter med det nye Dato tid API - java.tid der blev introduceret i Java 8 inden man kiggede på det gamle java.util.Date datatype, der også bruges til at repræsentere datoer.

For at afslutte ser vi også på nogle eksterne biblioteker til konvertering ved hjælp af Joda-Time og Apache Commons Lang DateUtils klasse.

2. Konvertering Snor til LocalDate eller LocalDateTime

LocalDate og LocalDateTime er uforanderlige dato- og tidsobjekter, der repræsenterer en dato og sidst en dato og et klokkeslæt. Som standard er Java-datoer i ISO-8601-format, så hvis vi har en streng, der repræsenterer en dato og et klokkeslæt i dette format, så vi kan bruge parse () API af disse klasser direkte.

Her er lidt flere detaljer om denne nye API.

2.1. Bruger Parse API

Dato-tid API giver parse () metoder til parsing a Snor der indeholder dato og klokkeslæt. At konvertere strengobjekter til LocalDate og LocalDateTime genstande, den Snor skal repræsentere en gyldig dato eller et gyldigt tidspunkt i henhold til ISO_LOCAL_DATE eller ISO_LOCAL_DATE_TIME.

Ellers a DateTimeParseException vil blive kastet ved kørsel.

Lad os i vores første eksempel konvertere en Snor til en java.tid.LocalDate:

LocalDate date = LocalDate.parse ("05-05-2018");

En lignende tilgang til ovenstående kan bruges til at konvertere en Snor til en java.tid.LocalDateTime:

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

Det er vigtigt at bemærke, at både LocalDate og LocalDateTime objekter er agnostiske i tidszoner. Imidlertid, når vi har brug for at behandle en tidszone-specifik dato og tidspunkter, kan vi bruge ZonedDateTimeparse metode direkte for at få en tidszone bestemt dato klokkeslæt:

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

Lad os nu se på, hvordan vi konverterer strenge med et brugerdefineret format.

2.2. Bruger Parse API med en brugerdefineret formatering

Konvertering af en Snor med et brugerdefineret datoformat til en Dato objekt er en udbredt operation i Java.

Til dette formål, vi bruger DateTimeFormatter klasse, der giver adskillige foruddefinerede formater, og giver os mulighed for at definere en formatering.

Lad os starte med et eksempel på at bruge en af ​​de foruddefinerede formatere af DateTimeFormatter:

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

Lad os i det næste eksempel oprette en formatering, der anvender et format på “EEE, MMM d yyyy”. Dette format specificerer tre tegn for ugens fulde dagnavn, et ciffer til at repræsentere månedsdagen, tre tegn til at repræsentere måneden og fire cifre til at repræsentere året.

Denne formater genkender strenge som “Fre, 3. jan 2003 ″ eller “ons 23. marts 1994“:

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

2.3. Almindelige dato- og tidsmønstre

Lad os se på nogle almindelige 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 uge (fredag, søndag)
  • -en Am / pm markør (AM, PM)
  • H - Time i dag (0-23)
  • h - Time i am / pm (1-12)
  • m - Minut i time (0-60)
  • s - Andet i minut (0-60)

Klik her for en komplet liste over symboler, som vi kan bruge til at specificere et mønster til parsing.

Hvis vi har brug for at konvertere java.tid går ind i den ældre java.util.Date objekt, læs denne artikel for flere detaljer.

3. Konvertering Snor til java.util.Date

Før Java 8 blev Java-dato- og tidsmekanismen leveret af de gamle API'er fra java.util.Date, java.util.Kalenderog java.util.TimeZone klasser som vi nogle gange stadig har brug for at arbejde med.

Lad os se, hvordan man konverterer en streng til en java.util.Date objekt:

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

I ovenstående eksempel vi skal først konstruere en SimpleDateFormat objekt ved at sende mønsteret, der beskriver dato og tidsformat.

Dernæst skal vi påberåbe os parse () metode, der passerer datoen Snor. Hvis den Snor argument, der er sendt, er ikke i samme format som mønsteret, så a ParseException vil blive kastet.

3.1. Tilføjelse af tidszoneoplysninger til java.util.Date

Det er vigtigt at bemærke, at java.util.Date har intet begreb om tidszone, og repræsenterer kun antallet af sekunder, der er gået siden Unix-tiden - 1970-01-01T00: 00: 00Z.

Men når vi udskriver Dato modsætter sig direkte, vil det altid blive udskrevet med Java-standardsystemets tidszone.

I dette sidste eksempel ser vi på, hvordan man formaterer en dato og tilføjer tidszoneoplysninger:

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

Vi kan også ændre JVM-tidszonen programmatisk, men dette anbefales ikke:

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

4. Eksterne biblioteker

Nu hvor vi har en god forståelse af, hvordan vi konverterer Snor genstande mod Dato objekter, der bruger de nye og gamle API'er, der tilbydes af core Java, lad os se på nogle eksterne biblioteker.

4.1. Joda-Time Bibliotek

Et alternativ til kernen Java Dato og Tid bibliotek er Joda-Time. Selvom forfatterne nu anbefaler brugere at migrere til java.tid (JSR-310), hvis dette ikke er muligt, så Joda-Time-biblioteket giver et fremragende alternativ til at arbejde med dato og klokkeslæt. Dette bibliotek giver stort set alle funktioner, der understøttes i Java 8 Dato tid projekt.

Artefakten kan findes på Maven Central:

 joda-tid joda-tid 2.10 

Her er et hurtigt eksempel, der arbejder 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);

Lad os også se et eksempel på eksplicit at indstille en tidszone:

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

Det DateUtils klasse giver mange nyttige hjælpeprogrammer, der gør det lettere at arbejde med arven Kalender og Dato genstande.

Commons-lang3 artefakten er tilgængelig fra Maven Central:

 org.apache.commons commons-lang3 3.7 

Lad os konvertere en dato Snor ved hjælp af en Array af 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. Konklusion

I denne artikel illustrerede vi flere måder at konvertere strenge til forskellige typer Dato objekter (med og uden tid), både i almindelig Java såvel som ved hjælp af eksterne biblioteker.

Den fulde kildekode for artiklen er tilgængelig på GitHub.