Перетворити рядок на дату в Java

1. Огляд

У цьому уроці ми розглянемо кілька способів перетворення строкових об'єктів в Даті об'єкти . Ми почнемо з нового API дати часу - java.time, який був введений в Java 8, перш ніж розглядати старий тип даних java.util.Date, який також використовувався для представлення дат.

На завершення ми також розглянемо деякі зовнішні бібліотеки для перетворення за допомогою Joda-Time та класу Apache Commons Lang DateUtils .

2. Перетворення рядка в LocalDate або LocalDateTime

LocalDate та LocalDateTime - це незмінні об’єкти дати та часу, які представляють дату, а згодом дату та час. За замовчуванням дати Java мають формат ISO-8601, тому, якщо у нас є будь-який рядок, який представляє дату та час у цьому форматі, ми можемо використовувати API parse () цих класів безпосередньо .

Ось трохи докладніше про цей новий API.

2.1. Використання Синтаксичної API

API Date-Time надає методи parse () для синтаксичного аналізу рядка, що містить інформацію про дату та час. Щоб перетворити об’єкти рядка в об’єкти LocalDate та LocalDateTime , рядок повинен представляти дійсну дату або час відповідно до ISO_LOCAL_DATE або ISO_LOCAL_DATE_TIME.

В іншому випадку DateTimeParseException буде видано під час виконання.

У нашому першому прикладі, давайте перетворимо рядок у java.time . LocalDate :

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

Подібний підхід до вищезазначеного може бути використаний для перетворення рядка в 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 синтаксичного аналізу з користувацьким форматом

Перетворення рядка з користувацьким форматом дати в об’єкт 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)
  • М - місяць у році (липень; липень; 07)
  • d - день у місяці (1-31)
  • E - назва дня в тижні (п’ятниця, неділя)
  • a - маркер Am / pm (AM, PM)
  • H - Година в день (0-23)
  • h - Година вранці / вечора (1-12)
  • м - хвилина в годині (0-60)
  • s - секунда за хвилину (0-60)

Повний список символів, за допомогою яких ми можемо вказати шаблон аналізу, натисніть тут.

Якщо нам потрібно перетворити дати java.time у застарілий об’єкт java.util.Date , прочитайте цю статтю, щоб дізнатися більше.

3. Перетворення рядка в java.util.Date

До Java 8 механізм дати та часу Java забезпечувався старими API- класами класів java.util.Date , java.util.Calendar та java.util.TimeZone, з якими іноді нам ще потрібно працювати.

Давайте подивимося, як перетворити рядок в об’єкт 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.