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

Как преобразовать строку в дату в Java

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