Konwertuj ciąg na datę w Javie

1. Przegląd

W tym tutorialu, będziemy badać kilka sposobów konwersji String przedmiotów do data obiektów . Zaczniemy od nowego API Date Time - java.time, które zostało wprowadzone w Javie 8, zanim przyjrzymy się starym typom danych java.util.Date używanym również do reprezentowania dat.

Na koniec przyjrzymy się także niektórym zewnętrznym bibliotekom do konwersji przy użyciu Joda-Time i klasy Apache Commons Lang DateUtils .

2. Konwersja String na LOCALDATE lub LocalDateTime

LocalDate i LocalDateTime to niezmienne obiekty daty i godziny, które reprezentują datę, a ostatnio datę i godzinę. Domyślnie daty Java są w formacie ISO-8601, więc jeśli mamy jakikolwiek ciąg, który reprezentuje datę i godzinę w tym formacie, to możemy bezpośrednio użyć parse () API tych klas .

Oto nieco więcej szczegółów na temat tego nowego interfejsu API.

2.1. Korzystanie z interfejsu API analizy

Funkcja API Date-Time udostępnia metody parse () do analizowania ciągu znaków, który zawiera informacje o dacie i godzinie. Aby przekonwertować obiekty String na obiekty LocalDate i LocalDateTime , String musi reprezentować prawidłową datę lub godzinę zgodnie z ISO_LOCAL_DATE lub ISO_LOCAL_DATE_TIME.

W przeciwnym razie DateTimeParseException zostanie zgłoszony w czasie wykonywania.

W naszym pierwszym przykładzie przekonwertujmy String na java.time . LocalDate :

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

Podobne podejście do powyższego może być użyty do konwersji String do java.time . LocalDateTime :

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

Ważne jest, aby pamiętać, że zarówno LOCALDATE i LocalDateTime obiekty są agnostykiem stref czasowych. Jednak gdy musimy poradzić sobie z datą i godziną określoną dla strefy czasowej, możemy użyć metody analizy ZonedDateTime bezpośrednio, aby uzyskać datę i godzinę dla strefy czasowej:

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

Przyjrzyjmy się teraz, jak konwertujemy ciągi znaków w niestandardowym formacie.

2.2. Używanie interfejsu API analizowania z niestandardowym narzędziem formatującym

Konwersja ciągu znaków z niestandardowym formatem daty na obiekt Date to szeroko rozpowszechniona operacja w języku Java.

W tym celu użyjemy klasy DateTimeFormatter, która udostępnia wiele predefiniowanych elementów formatujących i umożliwia zdefiniowanie programu formatującego.

Zacznijmy od przykładu użycia jednego z predefiniowanych elementów formatujących DateTimeFormatter :

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

W następnym przykładzie stwórzmy program formatujący, który stosuje format „EEE, MMM d yyyy”. Ten format określa trzy znaki dla pełnej nazwy dnia tygodnia, jedną cyfrę oznaczającą dzień miesiąca, trzy znaki oznaczające miesiąc i cztery cyfry oznaczające rok.

Ten program do formatowania rozpoznaje ciągi, takie jak „ piątek, 3 stycznia 2003 r. ″ Lub„ środa, 23 marca 1994 r. ”:

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

2.3. Typowe wzorce daty i czasu

Spójrzmy na kilka typowych wzorców dat i godzin:

  • y - rok (1996; 96)
  • M - Miesiąc w roku (lipiec; lipiec; 07)
  • d - Dzień w miesiącu (1-31)
  • E - nazwa dnia tygodnia (piątek, niedziela)
  • a - Znacznik AM / PM (AM, PM)
  • H - godzina w dzień (0-23)
  • h - godzina am / pm (1-12)
  • m - minuta w godzinie (0-60)
  • s - sekunda w minucie (0-60)

Aby uzyskać pełną listę symboli, których możemy użyć do określenia wzorca do analizowania, kliknij tutaj.

Jeśli musimy przekonwertować daty java.time na starszy obiekt java.util.Date , przeczytaj ten artykuł, aby uzyskać więcej informacji.

3. Konwersja String na java.util.Date

Przed Java 8 mechanizm daty i czasu w Javie był udostępniany przez stare interfejsy API klas java.util.Date , java.util.Calendar i java.util.TimeZone , z którymi czasami nadal musimy pracować.

Zobaczmy, jak przekonwertować ciąg znaków na obiekt java.util.Date :

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

W powyższym przykładzie najpierw musimy skonstruować obiekt SimpleDateFormat , przekazując wzorzec opisujący format daty i godziny.

Następnie musimy wywołać metodę parse () przekazując datę String . Jeśli przekazany argument String nie ma tego samego formatu co wzorzec, zostanie zgłoszony wyjątek ParseException .

3.1. Dodawanie informacji o strefie czasowej do java.util.Date

Należy zauważyć, że java.util.Date nie ma pojęcia strefy czasowej i reprezentuje tylko liczbę sekund, które minęły od czasu epoki Uniksa - 1970-01-01T00: 00: 00Z.

Ale kiedy drukujemy bezpośrednio obiekt Date , zawsze będzie on drukowany z domyślną strefą czasową systemu Java.

W tym ostatnim przykładzie przyjrzymy się, jak sformatować datę, dodając informacje o strefie czasowej:

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

Możemy również programowo zmienić strefę czasową maszyny JVM, ale nie jest to zalecane:

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

4. Biblioteki zewnętrzne

Teraz, gdy już dobrze wiemy, jak konwertować obiekty String na obiekty Date przy użyciu nowych i starych interfejsów API oferowanych przez rdzenną Javę, przyjrzyjmy się niektórym bibliotekom zewnętrznym.

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

DateUtils klasa udostępnia wiele przydatnych narzędzi, co ułatwia pracę z dotychczasowymi Kalendarz i data obiektów .

Artefakt commons-lang3 jest dostępny w Maven Central:

 org.apache.commons commons-lang3 3.7 

Przekonwertujmy ciąg daty przy użyciu tablicy wzorców dat na 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. Wniosek

W tym artykule zilustrowaliśmy kilka sposobów konwertowania ciągów znaków na różne typy obiektów Date (z czasem i bez), zarówno w zwykłej Javie, jak i przy użyciu bibliotek zewnętrznych.

Pełny kod źródłowy artykułu jest dostępny na GitHub.