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

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

1. обзор

В этом руководствеwe’ll explore several ways to convert String objects into Date objects. Мы начнем с нового APIDate Time -java.time, который был представлен в Java 8, прежде чем рассмотрим старый тип данныхjava.util.Date, также используемый для представления дат.

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

2. ПреобразованиеString вLocalDate илиLocalDateTime

[.s1]#LocalDate #and LocalDateTime are неизменяемые объекты даты и времени, которые представляют дату, а затем дату и время. По умолчанию даты Java находятся в формате ISO-8601, поэтому, если у нас есть какая-либо строка, представляющая дату и время в этом формате, тогдаwe can use the parse() API of these classes directly.

Here 'немного подробнее об этом новом API.

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

The Date-Time API provide parse() methods for parsing a String that contains date and time information. To convert String objects to LocalDate and LocalDateTime objects, the String must represent a valid date or time согласно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 не зависят от часового пояса. Однако методwhen we need to deal with time zone specific date and times we can use the ZonedDateTimeparse напрямую для получения даты и времени для конкретного часового пояса:

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

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

2.2. Использование APIParse с пользовательским форматером

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

Для этогоwe’ll use the DateTimeFormatter class which provides numerous predefined formatters, и позволяет нам определить средство форматирования.

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

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

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

Это средство форматирования распознает такие строки, как «Fri,  3 Jan 2003″ or “Wed, 23 Mar 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)

  • m - Минута в часе (0-60)

  • s - секунда в минуте (0-60)

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

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

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

Before Java 8, the Java date and time mechanism was provided by the old APIs of java.util.Date, java.util.Calendar, and java.util.TimeZone classes, с которым иногда все же нужно работать.

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

SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);

String dateInString = "7-Jun-2013";
Date date = formatter.parse(dateInString);

В приведенном выше примереwe first need to construct a SimpleDateFormat object путем передачи шаблона, описывающего формат даты и времени.

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

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

It’s important to note that the java.util.Date has no concept of time zone, и представляет только количество секунд, прошедших с момента эпохи Unix - 1970-01-01T00: 00: 00Z.

Но когда мы печатаем объектDate напрямую, он всегда будет печататься с системным часовым поясом Java по умолчанию.

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

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);

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

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

4. Внешние библиотеки

Теперь, когда у нас есть хорошее понимание того, как преобразовать объектыString в объектыDate, используя новые и старые API, предлагаемые ядром Java, давайте взглянем на некоторые внешние библиотеки.

4.1. Joda-Time Library

Альтернативой базовой библиотеке JavaDate иTime являетсяJoda-Time. Хотя сейчас авторы рекомендуют пользователям перейти наjava.time (JSR-310), если это невозможно, то наJoda-Time library provides an excellent alternative for working with Date and Time. Эта библиотека предоставляет практически все возможности, поддерживаемые в проекте Java 8Date Time.

Артефакт можно найти наMaven Central:


    joda-time
    joda-time
    2.10

Вот быстрый пример работы со стандартным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);

Давайте также посмотрим на пример явной установки часового пояса:

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 предоставляет многоuseful utilities making it easier to work with the legacy Calendar and Date objects.

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


    org.apache.commons
    commons-lang3
    3.7

Давайте преобразуем датуString, используяArray шаблонов даты, в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, так и с использованием внешних библиотек.

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