Konvertera sträng till datum i Java

1. Översikt

I den här guiden kommer vi att undersöka olika sätt att konvertera String föremål i Date -objekt . Vi börjar med den nya Date Time API - java.time som introducerades i Java 8 innan vi tittade på den gamla java.util.Date-datatypen som också används för att representera datum.

För att avsluta, kommer vi också att titta på några externa bibliotek för konvertering med Joda-Time och Apache Commons Lang DateUtils- klassen.

2. Konvertera sträng till LocalDate eller LocalDateTime

LocalDate och LocalDateTime är oföränderliga datum-tidsobjekt som representerar ett datum och senare ett datum och tid. Som standard är Java-datum i ISO-8601-format, så om vi har någon sträng som representerar ett datum och en tid i det här formatet kan vi använda parse () API för dessa klasser direkt .

Här är lite mer detaljer om detta nya API.

2.1. Med hjälp av Parse API

Datum-tid-API: et ger parse () -metoder för att analysera en sträng som innehåller datum- och tidsinformation. För att konvertera strängobjekt till LocalDate- och LocalDateTime- objekt måste strängen representera ett giltigt datum eller tid enligt ISO_LOCAL_DATE eller ISO_LOCAL_DATE_TIME.

Annars kastas ett DateTimeParseException vid körning.

I vårt första exempel, låt oss konvertera en sträng till en java.time . LocalDate :

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

Ett liknande tillvägagångssätt som ovan kan användas för att konvertera en sträng till en java.time . LocalDateTime :

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

Det är viktigt att notera att både LocalDate- och LocalDateTime- objekten är agnostiska för tidszoner. Men när vi behöver ta itu med tidszonsspecifikt datum och tider kan vi använda analyseringsmetoden ZonedDateTime direkt för att få en tidszonsspecifik datumtid :

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

Låt oss nu titta på hur vi konverterar strängar med ett anpassat format.

2.2. Använda Parse API med en anpassad formaterare

Omvandla en sträng med ett anpassat datumformat till ett datumobjekt är en utbredd operation i Java.

För detta ändamål använder vi klassen DateTimeFormatter som tillhandahåller många fördefinierade formaterare och låter oss definiera en formaterare.

Låt oss börja med ett exempel på att använda en av de fördefinierade formaterarna av DateTimeFormatter :

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

I nästa exempel ska vi skapa en formaterare som tillämpar formatet “EEE, MMM d yyyy”. Det här formatet anger tre tecken för veckans hela dagens namn, en siffra som representerar månadsdagen, tre tecken som representerar månaden och fyra siffror som representerar året.

Denna formaterare känner igen strängar som ” fre, 3 jan 2003 ″ eller” ons, 23 mar 1994 “:

String dateInString = "Mon, 05 May 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse(dateInString, formatter);

2.3. Vanliga datum- och tidsmönster

Låt oss titta på några vanliga datum- och tidsmönster:

  • y - år (1996; 96)
  • M - Månad i år (juli; juli; 07)
  • d - Dag i månad (1-31)
  • E - Dagsnamn i veckan (fredag, söndag)
  • a - Am / pm-markör (AM, PM)
  • H - timme i dag (0-23)
  • h - Timme i am / pm (1-12)
  • m - minut i timme (0-60)
  • s - Andra på minut (0-60)

Klicka här för en fullständig lista med symboler som vi kan använda för att ange ett mönster för tolkning.

Om vi ​​behöver konvertera java.time- datum till det äldre java.util.Date- objektet, läs den här artikeln för mer information.

3. Konvertera sträng till java.util.Date

Före Java 8, datum och tid mekanism Java från de gamla API i java.util.Date , java.util.Calendar och java.util.TimeZone klasser som ibland vi fortfarande måste arbeta med.

Låt oss se hur man konverterar en sträng till ett java.util.Date- objekt:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);

I exemplet ovan behöver vi först konstruera ett SimpleDateFormat- objekt genom att skicka mönstret som beskriver datum- och tidsformat.

Därefter måste vi åberopa metoden parse () som passerar datumet String . Om strängargumentet som skickas inte har samma format som mönstret kastas en ParseException .

3.1. Lägga till tidszoninformation till java.util.Date

Det är viktigt att notera att java.util.Date inte har något begrepp med tidszon och endast representerar antalet sekunder som gått sedan Unix-epoken - 1970-01-01T00: 00: 00Z.

Men när vi skriver ut Date- objektet direkt kommer det alltid att skrivas ut med Java-systemets standardtidstid.

I det sista exemplet tittar vi på hur man formaterar ett datum och lägger till tidszoninformation:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Date date = formatter.parse(dateInString); String formattedDateString = formatter.format(date);

Vi kan också ändra JVM-tidszonen programmatiskt, men detta rekommenderas inte:

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

4. Externa bibliotek

Nu när vi har en god förståelse för hur man konverterar strängobjekt till datumobjekt med de nya och gamla API: er som erbjuds av Java-kärnan, låt oss ta en titt på några externa bibliotek.

4.1. Joda-Time Library

An alternative to the core Java Date and Time library is Joda-Time. Although the authors now recommend users to migrate to java.time (JSR-310) if this isn't possible then the Joda-Time library provides an excellent alternative for working with Date and Time. This library provides pretty much all capabilities supported in the Java 8 Date Time project.

The artifact can be found on Maven Central:

 joda-time joda-time 2.10 

Here’s a quick example working with the standard DateTime:

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

Let's also see an example of explicitly setting a time zone:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy 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

Den DateUtils klassen ger många användbara verktyg som gör det lättare att arbeta med arvet kalender och datum föremål .

Commons-lang3 artefakten är tillgänglig från Maven Central:

 org.apache.commons commons-lang3 3.7 

Låt oss konvertera ett datum String med hjälp av en array av datum mönster i en java.util.Date :

String dateInString = "07/06-2013"; Date date = DateUtils.parseDate(dateInString, new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. Sammanfattning

I den här artikeln illustrerade vi flera sätt att konvertera strängar till olika typer av Date- objekt (med och utan tid), både i vanlig Java och med hjälp av externa bibliotek.

Den fullständiga källkoden för artikeln finns tillgänglig på GitHub.