Как перевести строку в дату java

от admin

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

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

Преобразование строки в дату на Java (или на любом другом языке программирования) — это фундаментальный навык, который полезно знать при работе над проектами. Иногда проще работать со строкой, представляющей дату, а затем преобразовать ее в объект Date для дальнейшего использования. В этой статье мы рассмотрим множество методов и библиотек, которые вы можете использовать для преобразования строки Java в объект даты. API даты / времени API даты / времени в Java работает с ISO 8601 [https://en.wikipedia.org/wiki/ISO_8601]

Время чтения: 7 мин.

Преобразование строки в дату на Java (или на любом другом языке программирования) — это фундаментальный навык, который полезно знать при работе над проектами. Иногда проще работать со строкой, представляющей дату, а затем преобразовать ее в Date для дальнейшего использования.

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

API даты / времени

API даты / времени в Java по умолчанию работает с форматом ISO 8601 (yyyy-MM-dd) .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • y : Год (2018, 18)
  • M : Месяц в году (август, август 08)
  • d : День в месяце (1, 5, 25)
  • E : Название дня недели (понедельник, суббота)
  • a : маркер Ante meridiem / Post meridiem (AM, PM)
  • H : Час в 24-часовом стиле (1, 7, 14, 21)
  • h : Час в 12-часовом стиле (1, 5, 12)
  • m : Минута в часе (1, 25, 54)
  • s : Секунда в минуту (1, 25, 54)

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

  • G : обозначение эпохи (AD, CE)
  • Y : год недели (2018, 18)
  • w : Неделя в году (25, 53)
  • W : Неделя в месяц (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 построен с использованием этого класса.

java.util.Date

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

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

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

Выполнение этого фрагмента кода даст:

«22:23:43 CEST» соответствует времени «10:23:43 PM», а форматированная дата представляет «8:23:43 PM», поскольку находится в другом часовом поясе.

SimpleDateFormat против DateTimeFormatter

Читая эту статью, уместно задать вопрос — «В чем разница, и какой из них я должен использовать? »

DateTimeFormatter был добавлен в Java 8 с новым API даты / времени и заменяет старый, теперь реже используемый SimpleDateFormat . Он поточно-ориентирован, в отличие от своего старого аналога, и предлагает новые функции:

Ясно видеть разницу между этими двумя. Раньше средство форматирования использовалось для форматирования, а затем для анализа даты. В более новом способе даты имеют собственный формат и методы синтаксического анализа, а 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:

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

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

Apache Commons

Apache Commons — полезная библиотека, используемая во многих проектах.

Чтобы добавить эту библиотеку в свой проект, вы можете использовать зависимость Maven:

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

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

Заключение

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

Java — Convert a String to Date (LocalDate, LocalDateTime, ZonedDateTime, LocalTime) | Code Factory

Find several examples demonstrating how to convert a date represented as a String to a Date, LocalDate, LocalDateTime, ZonedDateTime, or LocalTime instance in Java.

How to convert a String to Date in Java using SimpleDateFormat

Dates are represented as Strings by using some patterns and symbols. Java’s SimpleDateFormat class uses the following patterns and symbols for parsing a String to Date.

Output :

Here is another example in which we parse a more complex date time representation :

Output :

Convert/Parse a String to LocalDate

We can also use the DateTime API introduced in Java 8 to convert a String to an instance of various DateTime classes like LocalDate, LocalTime, LocalDateTime, ZonedDateTime etc.

Читать:
Mod deflate как включить

The DateTime API has a DateTimeFormatter class that can be used to define the date time format and parse the String according to the specified date time format. The DateTimeFormatter class uses the following patterns and symbols :

Java string to date conversion

What is the best way to convert a String in the format ‘January 2, 2010’ to a Date in Java?

Ultimately, I want to break out the month, the day, and the year as integers so that I can use

to convert the date into time.

17 Answers 17

That’s the hard way, and those java.util.Date setter methods have been deprecated since Java 1.1 (1997). Moreover, the whole java.util.Date class was de-facto deprecated (discommended) since introduction of java.time API in Java 8 (2014).

Simply format the date using DateTimeFormatter with a pattern matching the input string (the tutorial is available here).

In your specific case of "January 2, 2010" as the input string:

  1. "January" is the full text month, so use the MMMM pattern for it
  2. "2" is the short day-of-month, so use the d pattern for it.
  3. "2010" is the 4-digit year, so use the yyyy pattern for it.

Note: if your format pattern happens to contain the time part as well, then use LocalDateTime#parse(text, formatter) instead of LocalDate#parse(text, formatter) . And, if your format pattern happens to contain the time zone as well, then use ZonedDateTime#parse(text, formatter) instead.

Here’s an extract of relevance from the javadoc, listing all available format patterns:

Symbol Meaning Presentation Examples
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M / L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q / q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e / c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset ‘Z’ for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;

Do note that it has several predefined formatters for the more popular patterns. So instead of e.g. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); , you could use DateTimeFormatter.RFC_1123_DATE_TIME . This is possible because they are, on the contrary to SimpleDateFormat , thread safe. You could thus also define your own, if necessary.

For a particular input string format, you don’t need to use an explicit DateTimeFormatter : a standard ISO 8601 date, like 2016-09-26T17:44:57Z, can be parsed directly with LocalDateTime#parse(text) as it already uses the ISO_LOCAL_DATE_TIME formatter. Similarly, LocalDate#parse(text) parses an ISO date without the time component (see ISO_LOCAL_DATE ), and ZonedDateTime#parse(text) parses an ISO date with an offset and time zone added (see ISO_ZONED_DATE_TIME ).

Pre-Java 8

In case you’re not on Java 8 yet, or are forced to use java.util.Date , then format the date using SimpleDateFormat using a format pattern matching the input string.

Note the importance of the explicit Locale argument. If you omit it, then it will use the default locale which is not necessarily English as used in the month name of the input string. If the locale doesn’t match with the input string, then you would confusingly get a java.text.ParseException even though when the format pattern seems valid.

Here’s an extract of relevance from the javadoc, listing all available format patterns:

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M / L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00

Note that the patterns are case sensitive and that text based patterns of four characters or more represent the full form; otherwise a short or abbreviated form is used if available. So e.g. MMMMM or more is unnecessary.

Here are some examples of valid SimpleDateFormat patterns to parse a given string to date:

Input string Pattern
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G ‘at’ HH:mm:ss z
Wed, Jul 4, ’01 EEE, MMM d, »yy
12:08 PM h:mm a
12 o’clock PM, Pacific Daylight Time hh ‘o»clock’ a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd’T’HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd’T’HH:mm:ss.SSSXXX
2001-W27-3 YYYY-‘W’ww-u

An important note is that SimpleDateFormat is not thread safe. In other words, you should never declare and assign it as a static or instance variable and then reuse it from different methods/threads. You should always create it brand new within the method local scope.

Parsing and Formatting

The temporal-based classes in the Date-Time API provide parse methods for parsing a string that contains date and time information. These classes also provide format methods for formatting temporal-based objects for display. In both cases, the process is similar: you provide a pattern to the DateTimeFormatter to create a formatter object. This formatter is then passed to the parse or format method.

The DateTimeFormatter class provides numerous predefined formatters, or you can define your own.

The parse and the format methods throw an exception if a problem occurs during the conversion process. Therefore, your parse code should catch the DateTimeParseException error and your format code should catch the DateTimeException error. For more information on exception handing, see Catching and Handling Exceptions.

The DateTimeFormatter class is both immutable and thread-safe; it can (and should) be assigned to a static constant where appropriate.

Parsing

The one-argument parse(CharSequence) method in the LocalDate class uses the ISO_LOCAL_DATE formatter. To specify a different formatter, you can use the two-argument parse(CharSequence, DateTimeFormatter) method. The following example uses the predefined BASIC_ISO_DATE formatter, which uses the format 19590709 for July 9, 1959.

You can also define a formatter using your own pattern. The following code, from the Parse example, creates a formatter that applies a format of «MMM d yyyy». This format specifies three characters to represent the month, one digit to represent day of the month, and four digits to represent the year. A formatter created using this pattern would recognize strings such as «Jan 3 2003» or «Mar 23 1994». However, to specify the format as «MMM dd yyyy», with two characters for day of the month, then you would have to always use two characters, padding with a zero for a one-digit date: «Jun 03 2003».

The documentation for the DateTimeFormatter class specifies the full list of symbols that you can use to specify a pattern for formatting or parsing.

The StringConverter example on the Non-ISO Date Conversion page provides another example of a date formatter.

Formatting

The format(DateTimeFormatter) method converts a temporal-based object to a string representation using the specified format. The following code, from the Flight example, converts an instance of ZonedDateTime using the format «MMM d yyy hh:mm a». The date is defined in the same manner as was used for the previous parsing example, but this pattern also includes the hour, minutes, and a.m. and p.m. components.

The output for this example, which prints both the arrival and departure time, is as follows:

Похожие статьи