Автор оригинала: David Landup.
Преобразование строки в дату на Java (или любом языке программирования) является фундаментальным навыком, который полезно знать при работе над проектами. Иногда просто проще работать со строкой для представления даты, а затем преобразовать ее в объект Дата
для дальнейшего использования.
В этой статье мы рассмотрим множество методов и библиотек, которые вы можете использовать для преобразования строки Java в объект даты.
API даты/времени
API даты/времени в Java по умолчанию работает с форматом ISO 8601 , который является (гггг-ММ-дд)
.
Все даты по умолчанию соответствуют этому формату, и все преобразованные строки должны соответствовать ему, если вы используете форматирование по умолчанию.
разбор()
Этот API определяет метод parse ()
, который принимает последовательность символов и использует формат ISO_LOCAL_DATE
для анализа входных данных:
parse(CharSequence);
В качестве альтернативы вы можете использовать вариант этого метода с двумя аргументами, определяя другой формат:
parse(CharSequence, DateTimeFormatter);
DateTimeFormatter
используется для форматирования и анализа объектов даты и времени в новом API даты и времени. Все классы даты и времени из этого API содержат метод для анализа и форматирования, где каждый принимает DateTimeFormatter для определения шаблона.
Преобразование строки в локальную дату
Локальная дата
представляет дату без времени в формате ISO-8601.
Он отличается от Дата
тем, что он хранит время не как смещение в миллисекунду с эпохи, а просто текущую дату. Это также более новая реализация API даты/времени и предлагает свой собственный метод форматирования/анализа, а также сложение и вычитание дней, недель и лет, которых не существует в варианте Даты.
Чтобы преобразовать строку в Локальную дату
объект, достаточно написать:
LocalDate date = LocalDate.parse("2018-09-16");
Это эквивалентно написанию кода процедуры для создания экземпляра объекта LocalDate
:
LocalDate date = LocalDate.of(2018, 09, 16);
Преобразование строки в местное время
Местное время
представляет время без часового пояса в формате ISO-8601. Он не хранит время на основе смещения с эпохи, и он предлагает наносекунду точность.
Как и локальные данные, он предоставляет множество очень полезных встроенных методов анализа и форматирования, а также средства для добавления или вычитания времени из них.
Чтобы преобразовать строку в объект LocalTime
, достаточно написать:
LocalTime localTime = LocalTime.parse("8:00");
Это эквивалентно написанию кода процедуры для создания экземпляра объекта LocalTime
:
LocalTime localTime = LocalTime.of(8, 00);
Преобразование строки в LocalDateTime
LocalDateTime
является наиболее используемым классом в отношении даты/времени в Java. Он представляет собой комбинацию даты и времени и может использоваться для многих целей:
LocalDateTime localDateTime = LocalDateTime.parse("2018-09-16T08:00:00");
Поначалу этот формат может показаться запутанным, но на самом деле он довольно прост:
Маркер “Время” просто представляет собой линию между Локальной датой
и Локальным временем
частями формата.
Вы также можете легко отформатировать это LocalDateTime
в более читаемый формат:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatDateTime = localDateTime.format(formatter);
Запуск этого фрагмента кода и печать FormatDateTime
приведет к:
2018-09-16 08:00:00
Обычно вы делаете это, чтобы показать результат конечному пользователю в строковом формате, предварительно выполняя операции с объектом LocalDateTime
.
Преобразование строки в ZonedDateTime
В зависимости от проекта, над которым вы работаете, вам может потребоваться обрабатывать разные часовые пояса при работе с датами и временем.
Преобразование строки в объект ZonedDateTime
так же просто, как:
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-09-16T08:00:00+00:00[Europe/London]");
В приведенном выше примере показано, как вы инициализируете ZonedDateTime
для Лондона.
Преобразование строки с помощью пользовательского форматера
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Иногда мы хотели бы использовать наш собственный пользовательский форматер, который принимает строку самыми различными способами и все равно не создает исключение DateTimeParseException
.
Вот некоторые из наиболее распространенных шаблонов, которые вы бы использовали:
г
: Год (2018, 18)M
: Месяц в году (август, август, 08)d
: День в месяце (1, 5, 25)E
: Название дня недели (понедельник, суббота)a
: Маркер перед меридиемом/После меридиема (AM, PM)Ч
: Час в 24-часовом стиле (1, 7, 14, 21)ч
: Час в стиле 12 часов (1, 5, 12)m
: Минута в час (1, 25, 54)s
: Секунда в минуту (1, 25, 54)
А некоторые вы, возможно, используете не так часто:
G
: Обозначение эпохи (AD, CE)Г
: Неделя в году (2018, 18)ж
: Неделя в году (25, 53)Ж
: Неделя в месяце (2)D
: День в году (254)F
: День недели в месяце (3)E
: Название дня в неделю (понедельник, понедельник)u
: Номер дня недели (1, 4)k
: Час в сутках (17)K
: Час в сутки в AM/PM (5)S
: Миллисекунда (1245)z
: Общий часовой пояс (Тихоокеанское стандартное время;PST;GMT-8:00)Z
: Часовой пояс RFC 822 (-0800)X
: Часовой пояс ISO 8601 (-08, -0800, -8:00)
Примечание: Год недели отличается от года – год недели синхронизирован с циклом WEEK_OF_YEAR
. Все недели между первой и последней неделями (включительно) имеют одинаковое значение недели за год. Поэтому первый и последний дни недели года могут иметь разные значения календарного года.
Примечание: |/K и
H различаются одинаково
k и
h различаются.
H и
h относятся к модели 0-23 и 1-12 соответственно, в то время как
K и
k относятся к модели 0-11 и 1-24 соответственно.
Если это все еще не удовлетворяет вашей потребности в пользовательском форматере, вы можете использовать DateTimeFormatterBuilder для создания очень специфичных и сложных форматеров. Помимо прочего, DateTimeFormatter построен с использованием этого класса.
Если это все еще не удовлетворяет вашей потребности в пользовательском форматере, вы можете использовать || DateTimeFormatterBuilder || для создания очень специфичных и сложных форматеров. Помимо прочего, DateTimeFormatter построен с использованием этого класса.
Это более старый подход, который сегодня используется не часто, но его все равно стоит рассмотреть, так как иногда мы все еще используем классы из этих API:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); Date date = formatter.parse("22-Sep-2018");
Существует множество шаблонов, которые мы можем передать в конструктор SimpleDateFormat
. Вы можете комбинировать практически любое количество форматов, используя доступные шаблоны.
Невозможно установить часовой пояс для даты, потому что он просто не содержит такой информации. Тем не менее, легко отформатировать дату и добавить информацию о часовом поясе в строку:
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = formatter.parse("22-09-2018 08:23:43 PM"); String formattedDate = formatter.format(date); System.out.println(date); System.out.println(formattedDate);
Запуск этого фрагмента кода приведет к:
Sat Sep 22 22:23:43 CEST 2018 22-9-2018 08:23:43 PM
“”22:23:43 CEST” соответствует времени “10:23:43 вечера”, в то время как форматированные данные представляют “8:23:43 вечера”, поскольку они находятся в другом часовом поясе.
SimpleDateFormat против DateTimeFormatter
Читая эту статью, справедливо задать вопрос – ” В чем разница и какой из них я должен использовать? “
DateTimeFormatter
был добавлен в Java 8 с новым API даты и времени и заменяет более старый, теперь менее часто используемый/| SimpleDateFormat . Он потокобезопасен в отличие от своего старого аналога и предлагает новые функциональные возможности:
// SimpleDateFormat SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy"); Date date = new Date(); String formattedDate = formatter.format(date); Date parsedDate = formatter.parse(formattedDate); // DateTimeFormatter LocalDate date = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-M-yyyy"); String formattedDate = date.format(formatter); LocalDate parsedDate = LocalDate.parse(formattedDate, formatter);
Ясно видеть разницу между этими двумя. В более старом способе форматирование используется для форматирования, а затем для анализа даты. В более новом способе даты имеют свой собственный формат и методы анализа и используют DateTimeFormatter
просто для шаблона.
Если вы используете Java 8 и новый API, используйте DateTimeFormatter, тогда как если вы все еще используете более старую версию Java, используйте SimpleDateFormat.
Джода-Время
Joda-Time был разработан для устранения проблем со старыми классами времени и даты Java.
Начиная с Java 8, эти проблемы были исправлены, и Joda-Time выполнила свою задачу. Даже авторы его советуют перейти на официальный java.time
для работы с датами и временем.
В случае, если это невозможно, и для тех, кто все еще использует версию Java до Java 8, Joda-Time по-прежнему является отличной библиотекой для использования.
Зависимость для этой библиотеки может быть легко добавлена с помощью Maven зависимости:
joda-time joda-time {version}
Работа с Joda-Time очень похожа на работу с API даты/времени Java:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss"); DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter);
Класс Joda-Time DateTime
также поддерживает часовые пояса:
DateTimeFormatter formatter = DateTimeFormatter.forPattern("dd-MM-yyyy HH:mm:ss"); DateTime dateTime = DateTime.parse("22-Sep-2018 8:15:43", formatter); DateTime dateTimeZoned = dateTime.withZone(DateTimeZone.forID("Europe/London));
Для получения полного списка идентификаторов часовых поясов, доступных для использования, посетите официальные документы .
Apache Commons
Apache Commons – это полезная библиотека, используемая во многих проектах.
Чтобы добавить эту библиотеку в свой проект, вы можете использовать зависимость Maven:
org.apache.commons commons-lang3 {version}
Обе приведенные ниже реализации принимают массив шаблонов. Эти методы будут анализировать каждый шаблон за другим. Если ни один шаблон не соответствует входной строке, создается исключение ParseException
.
Использование преобразователя времени даты
DateTimeConverter dtc = new DateConverter(); dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" }); ConvertUtils.register(dtc, Date.class);
Использование таблиц дат
Date date = DateUtils.parseDate("22-Sep-2018", String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});
Вывод
Мы рассмотрели несколько способов преобразования простой строки в классы даты и времени в Java. Некоторые из этих подходов используют сторонние библиотеки, которые, возможно, уже есть в вашем проекте, а некоторые выполняются с использованием API, предлагаемых Java.