Автор оригинала: 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.