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.