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 .