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

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

· 6 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим несколько способов преобразования объектов String в объекты Date . Мы начнем с нового 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() для синтаксического анализа строки , содержащей информацию о дате и времени. Чтобы преобразовать объекты String в объекты LocalDate и LocalDateTime , String должен представлять допустимую дату или время в соответствии с ISO_LOCAL_DATE или ISO_LOCAL_DATE_TIME .

В противном случае во время выполнения будет создано исключение DateTimeParseException .

В нашем первом примере давайте преобразуем String в java.time . Местная Дата :

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

Подход, аналогичный описанному выше, можно использовать для преобразования String в java.time . Местная дата и время :

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

Важно отметить, что объекты LocalDate и LocalDateTime не зависят от часового пояса. Однако, когда нам нужно иметь дело с датами и временем, специфичными для часового пояса, мы можем использовать метод `` синтаксического анализа ZonedDateTime напрямую, чтобы получить дату и время для конкретного часового пояса:

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. Использование Parse 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. Общие шаблоны даты и времени

Давайте рассмотрим некоторые распространенные шаблоны даты и времени:

  • г – Год (1996; 96)
  • М – месяц в году (июль; июль; 07)
  • г – число в месяце (1-31)
  • E – название дня недели (пятница, воскресенье)
  • а маркер AM/PM (AM, PM)
  • Ч – час в сутках (0-23)
  • ч – час в AM/PM (1-12)
  • м – Минуты в часе (0-60)
  • с – секунда в минуту (0-60)

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

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

3. Преобразование строки в 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. Библиотека Джода-Время

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

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

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>

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

Класс DateUtils предоставляет множество полезных утилит, упрощающих работу с устаревшими объектами Calendar и Date .

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

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

Давайте преобразуем строку даты в 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 .