Рубрики
Без рубрики

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

Узнайте, как получить объект, представляющий дату, из строки в Java

Автор оригинала: Jonathan Cook.

1. Обзор

В этом уроке мы рассмотрим несколько способов преобразования String объектов в Data objects . Мы начнем с нового Даты и времени API, java.time , который был представлен в Java 8 перед просмотром старого java.util.Тип данных Date также используется для представления дат.

В заключение мы рассмотрим некоторые внешние библиотеки для преобразования с использованием Joda-Time и класса Apache Commons Lang DateUtils .

Дальнейшее чтение:

Преобразование java.util.Дата в строку

Проверьте, является ли строка Допустимой датой в Java

Преобразование между строкой и меткой времени

2. Преобразование строки в локальную дату или LocalDateTime

LocalDate и LocalDateTime являются неизменяемыми объектами даты и времени, которые представляют дату, а также дату и время соответственно. По умолчанию даты Java находятся в формате ISO-8601, поэтому, если у нас есть какая-либо строка, представляющая дату и время в этом формате, то мы можем использовать parse() API этих классов напрямую .

Вот немного более подробно об этом новом API.

2.1. Использование API синтаксического анализа

T he Date-Time API предоставляет parse() методы для анализа Строки , содержащей информацию о дате и времени. Для преобразования строковых объектов в объекты LocalDate и LocalDateTime Строка должна представлять действительную дату или время в соответствии с 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 parse напрямую, чтобы получить конкретную дату и время часового пояса:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05 10:15:30 Europe/Paris", formatter);

Теперь давайте посмотрим, как мы преобразуем строки в пользовательский формат.

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)
  • d – День в месяце (1-31)
  • E – Название дня в неделе (пятница, воскресенье)
  • a маркер AM/PM (AM, PM)
  • Ч – Час в день (0-23)
  • ч – Час в AM/PM (1-12)
  • м – Минута в час (0-60)
  • s – Секунда в минуту (0-60)

Для получения полного списка символов, которые мы можем использовать для указания шаблона для синтаксического анализа, нажмите здесь .

Если нам нужно преобразовать java.time dates в более старый java.util.Дата объект, прочитайте эту статью для получения более подробной информации.

3. Преобразование строки в java.util.Date

До Java 8 механизм даты и времени Java обеспечивался старыми API java.util.Дата , java.util.Календарь и java.util.Часовой пояс классы, с которыми нам иногда все еще нужно работать.

Давайте посмотрим, как преобразовать строку в java.util.Дата объект:

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.Дата не имеет понятия часового пояса и представляет только количество секунд , прошедших с момента времени эпохи 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, предлагаемые core Java, давайте рассмотрим некоторые внешние библиотеки.

4.1. Библиотека Joda-Time

Альтернативой ядру Java Date и Time библиотеки является Joda-Time . Хотя авторы теперь рекомендуют пользователям перейти на java.time (JSR-310), если это невозможно, библиотека Joda-Time предоставляет отличную альтернативу для работы с датой и временем . Эта библиотека предоставляет практически все возможности, поддерживаемые в проекте Java 8 Date Time .

Артефакт можно найти на Maven Central :


    joda-time
    joda-time
    2.10

Вот краткий пример работы со стандартным 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);

Давайте также рассмотрим пример явной установки часового пояса:

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 предоставляет множество полезных утилит, облегчающих работу с устаревшими объектами Calendar и Date |.

Артефакт commons-lang3 доступен в Maven Central :


    org.apache.commons
    commons-lang3
    3.11

Давайте преобразуем дату Строку в java.util.Дата использование Массива шаблонов дат:

String dateInString = "07/06-2013";
Date date = DateUtils.parseDate(dateInString, 
  new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. Заключение

В этой статье мы проиллюстрировали несколько способов преобразования строк в различные типы объектов Data (со временем и без времени), как в обычной Java, так и с использованием внешних библиотек.

Полный исходный код статьи доступен на GitHub .