Преобразовать строку в java.util.Date

Краткое руководство по преобразованию строки в дату в Java. А также примеры программ, использующих новый API даты Java 8.

Обзор

В этой статье вы узнаете, как преобразовать строку в дату в Java 8 как
а также с новым API DateTime Java 8.

Преобразование даты строки можно выполнить, вызвав метод parse() класса LocalDate,
Классы DateFormat и SimpleDateFormat.

LocalDate представлен в улучшениях Java 8.

DateFormat — это абстрактный класс, а прямым подклассом является SimpleDateFormat.

Чтобы преобразовать строку в дату, сначала необходимо создать SimpleDateFormat или
Объект LocalDate с форматом данных и методом parse() следующего вызова для создания
объект даты с содержимым строки date.

Во-первых, давайте напишем примеры в строке для датирования разговоров с
Классы SimpleDateFormat, а затем класс DateFormat.

Наконец, наконец, с помощью метода parse() класса LocalDate.

Примечание. В формате даты заглавная буква M обозначает месяц, а строчная буква m указывает на
минут.

Об этом спросят на собеседовании или письменном тесте «Как отформатировать дату для
Строка в Java 8?

Это трудный путь, и эти java.util. Методы установки даты устарели, начиная с Java 1.1 (1997 г.). Более того, весь java.util. Класс Date де-факто устарел (не рекомендуется) с момента появления API java.time в Java 8 (2014 г.).

Просто отформатируйте дату, используя DateTimeFormatter, используя шаблон, соответствующий входной строке (учебное пособие доступно здесь).

В вашем конкретном случае «2 января 2010 г.» в качестве входной строки:

String string = «2 января 2010 г.»;
Форматер DateTimeFormatter = DateTimeFormatter.ofPattern(«ММММ д, гггг», Locale. ENGLISH);
Дата LocalDate = LocalDate.parse(строка, форматтер);
System.out.println(дата); // 02.01.2010

Примечание: если ваш шаблон формата также содержит часть времени, используйте LocalDateTime#parse(text, formatter) вместо LocalDate#parse(text, formatter). И если ваш шаблон формата также содержит часовой пояс, вместо этого используйте ZonedDateTime#parse(text, formatter).

Вот выдержка из javadoc, в которой перечислены все доступные шаблоны форматов:

Обратите внимание, что он имеет несколько предопределенных форматов для наиболее популярных шаблонов. Поэтому вместо, например, DateTimeFormatter.ofPattern(«EEE, d MMM гггг ЧЧ:мм:сс Z», Locale. ENGLISH); вы можете использовать DateTimeFormatter. RFC_1123_DATE_TIME. Это возможно, поскольку они, в отличие от SimpleDateFormat, потокобезопасны. Таким образом, при необходимости вы также можете определить свой собственный.

Для определенного формата входной строки вам не нужно использовать явный DateTimeFormatter: стандартную дату ISO 8601, например 2016-09-26T17:44:57Z, можно проанализировать напрямую с помощью LocalDateTime#parse(text) поскольку он уже использует форматировщик ISO_LOCAL_DATE_TIME. Аналогично, LocalDate#parse(text) анализирует дату ISO без компонента времени (см. ISO_LOCAL_DATE), а ZonedDateTime#parse(text) анализирует дату ISO с добавленным смещением и часовым поясом (см. ISO_ZONED_DATE_TIME).

В этой статье мы рассмотрим множество методов и библиотек, которые вы
можно использовать для преобразования строк Java в объект даты.

Дата/время API

API дата/время в Java по умолчанию работает в формате ISO
8601 (гггг-ММ-дд) .

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

Анализировать ()

Этот API определяет parse(), который принимает последовательность
символы и использует ISO_LOCAL_DATE для ввода анализа:

В качестве альтернативы можно использовать вариант этого метода с
двумя аргументами, определяющими другой модуль формирования:

DateTimeFormatter используется для форматирования и анализа объектов.
дата и время в новой дате и времени API. Все классы даты и времени из
этот API содержит метод синтаксического анализа и формирования,
Каждый из них использует DateTimeFormatter для определения шаблона.

Преобразование строк в LocalDate

LocalDate представляет собой дату без времени в формате ISO-8601.

Он отличается от Date temp, который хранит время не в миллисекундном виде.
смещения с начала эпохи, а просто текущая дата. Это также более новая
дата/время реализации API и предлагает собственный метод
формирование/анализ, а также добавление и вычитание дней, недель и
лет, чего нет в варианте Date.

Чтобы преобразовать строку в LocalDate , достаточно написать:

Читайте также:  Распечатать справку о прекращении работы личный кабинет госуслуги

LocalDate date = LocalDate.parse(«2018-09-16»);

LocalDate кода для создания экземпляра объекта LocalDate:

LocalDate date = LocalDate.of(2018, 09, 16);

Преобразование строки в LocalTime

LocalTime представляет время без часового пояса в формате ISO-8601. Он
не хранит время на основе смещения с эпохи и обеспечивает точность в
наносекунду.

Как и LocalDate, он предоставляет множество очень полезных встроенных
методов синтаксического анализа и форматирования, а также средства для
добавления или вычитания из него времени.

Чтобы преобразовать строку в LocalTime , достаточно написать:

LocalTime localTime = LocalTime.parse(«8:00»);

LocalTime кода для создания экземпляра объекта LocalTime:

LocalTime localTime = LocalTime.of(8, 00);

Преобразование строки в LocalDateTime

LocalDateTime — это наиболее часто используемый класс для даты и
времени в Java. Он представляет собой комбинацию даты и времени и может
использоваться для многих целей:

LocalDateTime localDateTime = LocalDateTime.parse(«2018-09-16T08:00:00»);

Сначала этот формат может показаться запутанным, но на самом деле он
довольно прост:

Маркер «Время» просто представляет собой линию между частями формата
LocalDate и LocalTime

Вы также можете легко отформатировать этот LocalDateTime в более
читаемый формат:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(«yyyy-MM-dd HH:mm:ss»);
String formatDateTime = localDateTime.format(formatter);

Запуск этого фрагмента кода и печать formatDateTime даст:

Обычно вы делаете это, чтобы показать результат конечному пользователю в
строковом формате, предварительно LocalDateTime

Преобразование строки в ZonedDateTime

В зависимости от проекта, над которым вы работаете, вам может
потребоваться обрабатывать разные часовые пояса при работе с датами и
временем.

Преобразование String в ZonedDateTime так же просто, как:

В приведенном выше примере показано, как инициализировать
ZonedDateTime для Лондона.

Преобразование строки с помощью специального средства форматирования

Иногда мы могли бы пожелать использовать наш собственный модуль
форматирования, который принимает строку самыми разными способами и при
этом не генерирует DateTimeParseException .

Вот некоторые из наиболее распространенных шаблонов, которые вы бы
использовали:

И некоторые из них, возможно, вы не используете так часто:

Примечание. Год недели отличается от года — год недели
синхронизируется с циклом WEEK_OF_YEAR Все недели между первой и
последней неделями (включительно) имеют одинаковое значение года недели.
Следовательно, первый и последний дни недели могут иметь разные значения
календарного года.

Примечание: K и H различаются так же, как различаются k и h
H и h относятся к моделям 0-23 и 1-12 соответственно, а K и k
относятся к моделям 0-11 и 1-24 соответственно.

Если это по-прежнему не удовлетворяет вашу потребность в настраиваемом
средстве форматирования, вы можете использовать
DateTimeFormatterBuilder
для создания очень конкретных и сложных средств форматирования. Среди
прочего, DateTimeFormatter построен с использованием этого класса.

Java. util. Date

Это более старый подход, который сегодня нечасто используется, но его
все же стоит рассмотреть, поскольку иногда мы все еще используем классы
из этих API:

SimpleDateFormat formatter = new SimpleDateFormat(«dd-MM-yyyy»);

Date date = formatter.parse(«22-Sep-2018»);

Есть много шаблонов, которые мы можем передать в конструктор
SimpleDateFormat . Вы можете комбинировать практически любое
количество форматов, используя доступные шаблоны.

Установить часовой пояс для Date невозможно, потому что он просто не
содержит такой информации. Однако легко отформатировать дату и добавить
информацию о часовом поясе в строку:

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 PM», а форматированная
дата представляет «8:23:43 PM», поскольку находится в другом часовом
поясе.

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 очень похожа на работу с Java Date / Time API:

DateTimeFormatter formatter = DateTimeFormatter.forPattern(«dd-MM-yyyy HH:mm:ss»);

DateTime dateTime = DateTime.parse(«22-Sep-2018 8:15:43», formatter);

DateTime Joda-Time также поддерживает часовые пояса:

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:

Обе реализации ниже принимают массив шаблонов. Эти методы будут
анализировать каждый шаблон за другим. Если никакой шаблон не
соответствует входной строке, ParseException .

Использование DateTimeConverter

Мы рассмотрели несколько способов преобразования простой String в классы
Date и Date-Time в Java. Некоторые из этих подходов используют сторонние
библиотеки, которые у вас, возможно, уже есть в вашем проекте, а
некоторые реализованы с использованием API-интерфейсов, предлагаемых
Java.

ISO 8601

If your input string is in the standard ISO 8601 format of yyyy-MM-dd, you can ask that class to directly parse the string with no need to specify a formatter.

The ISO 8601 formats are used by default in java.time, for both parsing and generating string representations of date-time values.

LocalDate localDate = LocalDate.parse( «2015-01-02» );

How to convert string to date in Java 8 with LocalDate Custom Formatters

Now we are getting the date in the different format as «May 30, 2020» but for this, there is no predefined formatter. So now, How to convert the string to date object.

Let us use the DateTimeFormatter.ofPattern() method and pass the custom pattern as «MMM dd, yyyy».

See the simple program to string date conversion

While in 2010, java.util. Date was the class we all used (toghether with DateFormat and Calendar), those classes were always poorly designed and are now long outdated. Today one would use java.time, the modern Java date and time API.

Средство форматирования DateTimeFormatter = DateTimeFormatter.ofPattern(«д-МММ-гггг,ЧЧ:мм:сс»);

String dateTimeStringFromSqlite = «29 апреля 2010 г., 13:00:14»;
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStringFromSqlite, форматтер);
System.out.println(«вывод здесь: » + dateTime);

вывод здесь: 2010-04-29T13:00:14

Как отформатировать строку даты? Примеры нескольких форматов даты

Ниже программа показывает строку даты в различных форматах, которая преобразуется в объект Date с помощью метода parse() класса SimpleDateFormat.

Строка   —   Значения даты
31.01.2020 — Пт, 31 января 00:00:00 IST 2020
31 января 2020 г. — Пт, 31 января 00:00:00 IST 2020 г.
12 31, 2020 — Чт, 31 декабря 00:00:00 IST 2020
Чт, 31 января 2020 г. — Пт, 31 января 00:00:00 IST 2020 г.
Чт, 31 января 2020 г. 23:37:50 — Пт, 31 января 23:37:50 IST 2020 г.
31 января 2020 г. 23:37:50 — Пт, 31 января 23:37:50 IST 2020

Java 8 и более поздние версии имеют новую структуру java.time, которая делает эти другие ответы устаревшими. Эта структура вдохновлена ​​Joda-Time, определенной в JSR 310 и расширенной проектом ThreeTen-Extra. См. Учебное пособие.

Старые встроенные классы java.util. Дата/. Календарь, как известно, хлопотный и запутанный. Избежать их.

Java 8 DateTimeFormatter против SimpleDateFormat

Простая программа, показывающая различия между DateTimeFormatter и SimpleDateFormat.

API Java 8 возвращает объект LocalDate точно так же, как содержимое строки, но SimpleDateFormat создает объект Date, который по умолчанию показывает полную дату с секундами, даже если информация о времени не предоставляется.

Java 8 DateTimeFormatter 30 мая 2020 г.
SimpleDateFomat : суббота, 30 мая, 00:00:00 IST 2020

Как и Joda-Time, java.time имеет класс LocalDate, представляющий значение только даты, без времени суток и без часового пояса.

Что пошло не так в вашем коде?

Комбинация заглавных букв HH и aaa в строках шаблона формата не имеет особого смысла, поскольку HH означает час дня, что делает маркер AM/PM вместо aaa излишним. Однако это не должно причинить никакого вреда, и мне не удалось воспроизвести точные результаты, о которых вы сообщили. В любом случае ваш комментарий по делу, независимо от того, используете ли вы старомодный SimpleDateFormat или современный DateTimeFormatter:

«ааа» не следует использовать, если вы используете «ааа», укажите «чч»

Чч в нижнем регистре означает час в пределах AM или PM, от 01 до 12, поэтому потребуется маркер AM/PM.

До Java 8

На случай, если вы еще не используете Java 8 или вынуждены использовать java.util. Дата, затем отформатируйте дату с помощью SimpleDateFormat, используя шаблон формата, соответствующий входной строке.

Читайте также:  Фонд Социального Страхования Российской Федерации - Официальный сайт

String string = «2 января 2010 г.»;
Формат DateFormat = новый SimpleDateFormat («ММММ д, гггг», Locale. ENGLISH);
Дата Дата = format.parse(строка);
System.out.println(дата); // Суббота, 2 января 00:00:00 GMT 2010

Обратите внимание на важность явного аргумента Locale. Если вы его опустите, то будет использоваться языковой стандарт по умолчанию, который не обязательно является английским, как указано в названии месяца во входной строке. Если локаль не совпадает с входной строкой, вы можете сбить с толку java.text. ParseException, даже если шаблон формата кажется действительным.

Обратите внимание, что шаблоны чувствительны к регистру и что текстовые шаблоны из четырех или более символов представляют полную форму; в противном случае используется краткая или сокращенная форма, если таковая имеется. Так, например. М ММММ или более не требуется.

Вот несколько примеров допустимых шаблонов SimpleDateFormat для анализа заданной строки на сегодняшний день:

Важно отметить, что SimpleDateFormat не является потокобезопасным. Другими словами, вы никогда не должны объявлять и назначать ее как статическую переменную или переменную экземпляра, а затем повторно использовать ее из разных методов/потоков. Вы всегда должны создавать его совершенно заново в локальной области действия метода.

Могу ли я использовать java. время на Андроиде?

Да, java.time прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.

Шаблон форматирования

Прочтите документацию класса DateTimeFormatter для получения подробной информации о кодах, используемых в шаблоне формата. Они немного отличаются от старого устаревшего java.text. Шаблоны классов SimpleDateFormat.

Обратите внимание, что второй аргумент метода синтаксического анализа представляет собой ссылку на метод, синтаксис добавлен в Java 8 и более поздних версиях.

String input = «2 января 2015 г.»;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( «ММММ д, гггг», Locale.US);
LocalDate localDate = LocalDate.parse (ввод, форматтер);

Дамп на консоль.

System.out.println( «localDate: » + localDate);

Как преобразовать строку в дату в Java в формате дд-ММ-гггг

Исходная строка (содержащая значение даты) дд-ММ-гггг: 01-01-2020
Преобразованное значение даты: среда, 1 января, 00:00:00 IST 2020

Ссылки

Или вместо того, чтобы указывать шаблон форматирования, позвольте java.time локализоваться за вас. Вызовите DateTimeFormatter.ofLocalizedDate и обязательно укажите желаемую/ожидаемую локаль, а не полагайтесь на текущее значение по умолчанию JVM, которое может измениться в любой момент во время выполнения (!).

String input = «2 января 2015 г.»;
Средство форматирования DateTimeFormatter = DateTimeFormatter.ofLocalizedDate (FormatStyle. LONG);
formatter = formatter.withLocale(Locale.US);
LocalDate localDate = LocalDate.parse (ввод, форматтер);

Как преобразовать строку в дату в Java 8 с помощью предопределенных средств форматирования LocalDate

Класс DateTimeFormatter API Java 8 добавлен с набором предопределенных средств форматирования, которые часто используются разработчиками и являются отраслевыми стандартами.

Этот класс помогает подобрать правильные форматтеры. Затем передайте строку даты и средство форматирования методу LocalDate.parse(), который возвращает объект даты.

Метод LocalDate.parse() выполняет преобразование заданной строки с помощью заданного средства форматирования. Здесь используется форматировщик даты ISO_DATE, который выдает дату как «20 июля 2020 г.».

Если форматтер не соответствует строковому значению, он выдает исключение времени выполнения. Измените форматтер, как показано ниже.

DateTimeFormatter iso_date = DateTimeFormatter. BASIC_ISO_DATE;

Исключение в потоке «основной» java.time.format. DateTimeParseException: текст «2020-07-20» не удалось проанализировать по индексу 4
в java.time.format. DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
в java.time.format. DateTimeFormatter.parse(DateTimeFormatter.java:1851)
в java.time. LocalDate.parse(LocalDate.java:400)
в StringToDateExampleWithLocalDateWithPredefineFormatters.main(StringToDateExampleWithLocalDateWithPredefineFormatters.java:17)

Тл;др

Входная строка может иметь любой формат, но все форматы дат должны быть допустимыми.

Итак, сначала необходимо передать формат даты строки в класс SimpleDateFormat и
затем вызовите его метод parse(). Этот метод возвращает дату String в Date.
формат объекта.

См. пример ниже.

Исходная строка (содержащая значение даты): 01.01.2020.
Преобразованное значение даты: среда, 1 января, 00:00:00 IST 2020

.

Если формат даты не соответствует строковому значению, выдается исключение ParseException.

Исходная строка (содержащая значение даты): 01.01.2020.
Исключение в потоке «основной» java.text. ParseException: неразбираемая дата: «01.01.2020»
в java.text. DateFormat.parse(DateFormat.java:366)
в SimpleFormatStringToDateExample.main(SimpleFormatStringToDateExample.java:16)

Если у вас другой формат, укажите форматировщик из пакета java.time.format. Вы можете либо указать свой собственный шаблон форматирования, либо позволить java.time автоматически локализоваться в зависимости от локали, указав человеческий язык для перевода и культурные нормы для решения таких вопросов, как точка или запятая.

Заключение

В этой статье вы увидели, как преобразовать строку в дату с помощью методов SimpleDateFormat.parse() и LocalDate.parse() в Java 8.

Примеры различных форматов даты для преобразования строки в дату.

А также примеры программ для предопределенных форматов Java 8 и способы использования пользовательских форматов дат в Java 8.

Наконец, различия между Java 8 DateTimeFormatter и SimpleDateFormat.

Как обычно, все программы находятся на GitHub.

Оцените статью
ФСС Help
Добавить комментарий