1. Общ преглед
В този урок ще проучим няколко начина за конвертиране на String обекти в Date обекти . Ще започнем с новия API за дата и час - java.time, който е въведен в Java 8, преди да разгледаме стария тип данни java.util.Date, също използван за представяне на дати.
За финал ще разгледаме и някои външни библиотеки за преобразуване с помощта на Joda-Time и класа Apache Commons Lang DateUtils .
2. Преобразуване на String в LocalDate или LocalDateTime
LocalDate и LocalDateTime са неизменяеми обекти за дата и час, които представляват дата и в последствие дата и час. По подразбиране датите на Java са във формат ISO-8601, така че ако имаме някакъв низ, който представлява дата и час в този формат, тогава можем да използваме директно API на parse () на тези класове .
Ето малко повече подробности за този нов API.
2.1. Използване на API за разбор
Приложният програмен интерфейс за дата и час предоставя методите parse () за анализиране на низ, който съдържа информация за дата и час. За да се превърне String обекти да LOCALDATE и LocalDateTime обекти, на String трябва да представлява валидна дата или час според ISO_LOCAL_DATE или ISO_LOCAL_DATE_TIME.
В противен случай DateTimeParseException ще бъде хвърлен по време на изпълнение.
В нашия първи пример, нека преобразуваме String в java.time . LocalDate :
LocalDate date = LocalDate.parse("2018-05-05");
Подобен подход на горния може да се използва за конвертиране на String в java.time . LocalDateTime :
LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");
Важно е да се отбележи, че обектите LocalDate и LocalDateTime са агностични за часовата зона. Когато обаче трябва да се справим с датата и часовете, специфични за часовата зона, можем да използваме метода за синтактичен анализ на ZonedDateTime директно, за да получим час, определен за часовата зона:
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");
Сега нека да разгледаме как преобразуваме низове с персонализиран формат.
2.2. Използване на API за разбор с персонализиран формат
Преобразуването на String с персонализиран формат на дата в обект Date е широко разпространена операция в Java.
За тази цел ще използваме класа DateTimeFormatter, който предоставя множество предварително дефинирани форматиращи машини и ни позволява да дефинираме форматиращ инструмент.
Нека започнем с пример за използване на един от предварително дефинираните форматиращи устройства на DateTimeFormatter :
String dateInString = "19590709"; LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);
В следващия пример нека създадем форматиращ инструмент, който прилага формат на „EEE, MMM d yyyy“. Този формат определя три знака за цялото име на седмицата, една цифра, която представлява деня на месеца, три знака, които представляват месеца, и четири цифри, които представляват годината.
Този форматиращ апарат разпознава низове като „ петък, 3 януари 2003 г.“ или „сряда, 23 март 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. Общи модели на дата и час
Нека разгледаме някои често срещани модели на дата и час:
- y - Година (1996; 96)
- M - Месец в годината (юли; юли; 07)
- г - ден в месеца (1-31)
- E - Име на деня в седмицата (петък, неделя)
- a - Маркер Am / pm (AM, PM)
- H - Час в деня (0-23)
- ч - Час в сутринта / вечерта (1-12)
- m - минута в час (0-60)
- s - секунда в минута (0-60)
За пълен списък със символи, които можем да използваме, за да зададем шаблон за разбор, щракнете тук.
Ако трябва да конвертираме дати на java.time в по-стария обект java.util.Date , прочетете тази статия за повече подробности.
3. Преобразуване на String в java.util.Date
Преди Java 8 механизмът за дата и час на Java се осигуряваше от старите API на класовете java.util.Date , java.util.Calendar и java.util.TimeZone , с които понякога все още трябва да работим.
Нека да видим как да конвертираме String в обект java.util.Date :
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);
В горния пример първо трябва да конструираме обект SimpleDateFormat, като предадем шаблона, описващ формата на датата и часа.
След това трябва да извикаме метода parse () , преминавайки низа на датата . Ако аргументът String не е в същия формат като модела, тогава ще бъде хвърлено ParseException .
3.1. Добавяне на информация за часовата зона към java.util.Date
Важно е да се отбележи, че java.util.Date няма понятие за часова зона и представлява само броя на изминатите секунди от времето на епохата на Unix - 1970-01-01T00: 00: 00Z.
Но когато отпечатваме директно обекта Date , той винаги ще бъде отпечатан със системната часова зона по подразбиране на Java.
В този последен пример ще разгледаме как да форматирате дата, добавяйки информация за часовата зона:
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);
Можем и програмно да променим часовата зона на JVM, но това не се препоръчва:
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
4. Външни библиотеки
Сега, когато имаме добро разбиране за това как да конвертираме String обекти в Date обекти, използвайки новия и стария API, предлагани от основната Java, нека да разгледаме някои външни библиотеки.
4.1. Библиотека Joda-Time
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 предоставя много полезни помощни програми, улесняващи работата с наследените обекти Календар и Дата .
Артефактът commons-lang3 се предлага от Maven Central:
org.apache.commons commons-lang3 3.7
Нека преобразуваме низ от дата, използвайки масив от шаблони за дата, в 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. Заключение
В тази статия илюстрирахме няколко начина за преобразуване на низове в различни типове обекти Date (с и без време), както в обикновена Java, така и с помощта на външни библиотеки.
Пълният изходен код на статията е достъпен в GitHub.