Преобразование строки в дату в Java

1. Обзор

В этом уроке мы рассмотрим несколько способов преобразования строковых объектов в Дате объекты . Мы начнем с нового API даты и времени - java.time, который был введен в Java 8, прежде чем рассматривать старый тип данных java.util.Date, также используемый для представления дат.

В заключение мы также рассмотрим некоторые внешние библиотеки для преобразования с использованием Joda-Time и класса Apache Commons Lang DateUtils .

2. Преобразование строки в LocalDate или LocalDateTime

LocalDate и LocalDateTime - это неизменяемые объекты даты и времени, которые представляют дату, а затем дату и время. По умолчанию даты Java находятся в формате ISO-8601, поэтому, если у нас есть какая-либо строка, представляющая дату и время в этом формате, мы можем напрямую использовать API parse () этих классов .

Вот еще немного подробностей об этом новом API.

2.1. Использование Parse API

API Date-Time предоставляет методы parse () для анализа строки , содержащей информацию о дате и времени. Чтобы преобразовать объекты String в объекты LocalDate и LocalDateTime , строка должна представлять действительную дату или время в соответствии с ISO_LOCAL_DATE или ISO_LOCAL_DATE_TIME.

В противном случае во время выполнения будет выброшено исключение DateTimeParseException .

В нашем первом примере давайте преобразуем String в java.time . LocalDate :

LocalDate date = LocalDate.parse("2018-05-05");

Подход, аналогичный описанному выше, можно использовать для преобразования String в java.time . LocalDateTime :

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

Важно отметить, что объекты LocalDate и LocalDateTime не зависят от часового пояса. Однако, когда нам нужно иметь дело с датой и временем для конкретного часового пояса, мы можем напрямую использовать метод анализа ZonedDateTime, чтобы получить дату и время для конкретного часового пояса:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");

Теперь давайте посмотрим, как мы конвертируем строки в пользовательский формат.

2.2. Использование Parse API с настраиваемым форматером

Преобразование строки с настраиваемым форматом даты в объект Date - широко распространенная операция в Java.

Для этой цели мы будем использовать класс DateTimeFormatter, который предоставляет множество предопределенных средств форматирования и позволяет нам определять средство форматирования.

Начнем с примера использования одного из предопределенных форматеров DateTimeFormatter :

String dateInString = "19590709"; LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);

В следующем примере давайте создадим средство форматирования, которое применяет формат «EEE, MMM d yyyy». Этот формат определяет три символа для полного названия дня недели, одну цифру для представления дня месяца, три символа для представления месяца и четыре цифры для представления года.

Это средство форматирования распознает такие строки, как « Пт, 3 января 2003 г.» или «Среда, 23 марта 1994 г. »:

String dateInString = "Mon, 05 May 1980"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH); LocalDate dateTime = LocalDate.parse(dateInString, formatter);

2.3. Общие шаблоны даты и времени

Давайте посмотрим на некоторые общие шаблоны даты и времени:

  • y - Год (1996; 96)
  • M - Месяц в году (июль; июль; 07)
  • d - День в месяце (1-31)
  • E - название дня недели (пятница, воскресенье)
  • a - маркер Am / PM (AM, PM)
  • H - час в день (0-23)
  • h - час в am / pm (1-12)
  • м - Минута в часе (0-60)
  • s - секунда в минуте (0-60)

Чтобы увидеть полный список символов, которые мы можем использовать для определения шаблона для синтаксического анализа, щелкните здесь.

Если нам нужно преобразовать даты java.time в более старый объект java.util.Date , прочтите эту статью для получения дополнительных сведений.

3. Преобразование String в java.util.Date

До Java 8 механизм даты и времени Java предоставлялся старыми API-интерфейсами классов java.util.Date , java.util.Calendar и java.util.TimeZone, с которыми иногда нам все еще нужно работать.

Давайте посмотрим, как преобразовать String в объект java.util.Date :

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); String dateInString = "7-Jun-2013"; Date date = formatter.parse(dateInString);

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

Затем нам нужно вызвать метод parse (), передающий строку даты . Если переданный аргумент String не в том же формате, что и шаблон, будет сгенерировано исключение ParseException .

3.1. Добавление информации о часовом поясе в java.util.Date

Важно отметить, что java.util.Date не имеет понятия о часовом поясе и представляет только количество секунд, прошедших с момента эпохи Unix - 1970-01-01T00: 00: 00Z.

But, when we print the Date object directly, it will always be printed with the Java default system time zone.

In this final example we'll look at how to format a date, adding time zone information:

SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); String dateInString = "22-01-2015 10:15:55 AM"; Date date = formatter.parse(dateInString); String formattedDateString = formatter.format(date);

We can also change the JVM time zone programmatically, but this isn't recommended:

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

4. External Libraries

Now that we have a good understanding of how to convert String objects to Date objects using the new and old APIs offered by core Java let's take a look at some external libraries.

4.1. Joda-Time Library

An alternative to the core Java Date and Time library is Joda-Time. Although the authors now recommend users to migrate to java.time (JSR-310) if this isn't possible then the Joda-Time library provides an excellent alternative for working with Date and Time. This library provides pretty much all capabilities supported in the Java 8 Date Time project.

The artifact can be found on Maven Central:

 joda-time joda-time 2.10 

Here’s a quick example working with the standard DateTime:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter);

Let's also see an example of explicitly setting a time zone:

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss"); String dateInString = "07/06/2013 10:11:59"; DateTime dateTime = DateTime.parse(dateInString, formatter); DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));

4.2. Apache Commons Lang – DateUtils

Класс DateUtils предоставляет множество полезных утилит, упрощающих работу с устаревшими объектами Calendar и Date .

Артефакт commons-lang3 доступен в Maven Central:

 org.apache.commons commons-lang3 3.7 

Давайте преобразуем строку даты, используя массив шаблонов дат, в java.util.Date :

String dateInString = "07/06-2013"; Date date = DateUtils.parseDate(dateInString, new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });

5. Заключение

В этой статье мы проиллюстрировали несколько способов преобразования строк в различные типы объектов Date (со временем и без него), как в простой Java, так и с использованием внешних библиотек.

Полный исходный код статьи доступен на GitHub.