Преобразуване на низ в дата в Java

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.