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.