Вот несколько примеров Java преобразования строки в новый API даты Java 8 – java.time. Локальная дата
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); String date = "16/08/2016"; //convert String to LocalDate LocalDate localDate = LocalDate.parse(date, formatter);
Ключ в том, чтобы понять Преобразователь даты и времени
|/шаблоны
1. 2016-08-16
Если строка находится в формате ISO_LOCAL_DATE , мы можем проанализировать строку напрямую, преобразование не требуется.
package com.mkyong.date; import java.time.LocalDate; public class JavaDateExample1 { public static void main(String[] args) { String date = "2016-08-16"; //default, ISO_LOCAL_DATE LocalDate localDate = LocalDate.parse(date); System.out.println(localDate); } }
Выход
2016-08-16
2. 16-Август-2016 + Локаль. США
2.1 Приведенная ниже программа работает нормально, только если язык по умолчанию понимает английский. Например, Языковой стандарт. МЫ
или Локаль. Английский
package com.mkyong.date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class JavaDateExample2 { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy"); String date = "16-Aug-2016"; LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); //default, print ISO_LOCAL_DATE System.out.println(formatter.format(localDate)); // print formatter date } }
Выход
2016-08-16 16-Aug-2016
2.2 Теперь измените языковой стандарт на Языковой стандарт. франция
, в DateTimeFormatter
не сможет проанализировать Aug
и вызывает исключение DateTimeParseException
исключение:
package com.mkyong.date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class JavaDateExample2 { public static void main(String[] args) { // not all default locale is Locale.US // simulate a France locale. Locale.setDefault(Locale.FRANCE); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy"); String date = "16-Aug-2016"; LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); System.out.println(formatter.format(localDate)); } }
Exception in thread "main" java.time.format.DateTimeParseException: Text '16-Aug-2016' could not be parsed at index 3 at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046) at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948) at java.base/java.time.LocalDate.parse(LocalDate.java:428)
2.3 Самый безопасный способ – всегда указывать языковой стандарт. США
для Форматировщик даты и времени
.
package com.mkyong.date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class JavaDateExample2 { public static void main(String[] args) { Locale.setDefault(Locale.FRANCE); // no problem now, DateTimeFormatter always uses Locale.US DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy", Locale.US); String date = "16-Aug-2016"; LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); //default, print ISO_LOCAL_DATE System.out.println(formatter.format(localDate)); // print formatted date } }
Выход
2016-08-16 16-Aug-2016
3. 16/08/2016
package com.mkyong.date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class JavaDateExample3 { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); String date = "16/08/2016"; LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); System.out.println(formatter.format(localDate)); } }
Выход
2016-08-16 16/08/2016
4. Вт, 16 августа 2016 г.
package com.mkyong.date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class JavaDateExample4 { public static void main(String[] args) { // define a locale which understand English words, refer example 2 bug DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, MMM d yyyy", Locale.US); String date = "Tue, Aug 16 2016"; LocalDate localDate = LocalDate.parse(date, formatter); System.out.println(localDate); System.out.println(formatter.format(localDate)); } }
Выход
2016-08-16 Tue, Aug 16 2016
5. Вторник, 16 августа 2016 года 12:10:56 ВЕЧЕРА
В этом примере преобразуется строка в java.time. Локальное время
package com.mkyong.date; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class JavaDateExample5 { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, MMM d, yyyy hh:mm:ss a", Locale.US); String date = "Tuesday, Aug 16, 2016 12:10:56 PM"; LocalDateTime localDateTime = LocalDateTime.parse(date, formatter); System.out.println(localDateTime); System.out.println(formatter.format(localDateTime)); } }
Выход
2016-08-16T12:10:56 Tuesday, Aug 16, 2016 12:10:56 PM
6. 2016-08-16T15:23:01Z 2016-08-16T15:23:01Z
Суффикс Z
означает UTC, сначала преобразуйте строку в java.time.instant
и воспроизводите время с помощью ZonedDateTime
.
package com.mkyong.date; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; public class JavaDateExample6 { public static void main(String[] args) { String dateInString = "2016-08-16T15:23:01Z"; Instant instant = Instant.parse(dateInString); System.out.println("Instant : " + instant); //get date time only LocalDateTime result = LocalDateTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.getId())); //get localdate System.out.println("LocalDate : " + result.toLocalDate()); //get date time + timezone ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Asia/Tokyo")); System.out.println(zonedDateTime); //get date time + timezone ZonedDateTime zonedDateTime2 = instant.atZone(ZoneId.of("Europe/Athens")); System.out.println(zonedDateTime2); } }
Выход
Instant : 2016-08-16T15:23:01Z LocalDate : 2016-08-16 2016-08-17T00:23:01+09:00[Asia/Tokyo] 2016-08-16T18:23:01+03:00[Europe/Athens]
7.2016-08-16T10:15:30+08:00
Последний +08:00
– это часовой пояс. Строка
-> Дата в зоне
-> Локальная дата
.
package com.mkyong.date; import java.time.LocalDate; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class JavaDateExample7 { public static void main(String[] args) { String date = "2016-08-16T10:15:30+08:00"; ZonedDateTime result = ZonedDateTime.parse(date, DateTimeFormatter.ISO_DATE_TIME); System.out.println("ZonedDateTime : " + result); System.out.println("TimeZone : " + result.getZone()); LocalDate localDate = result.toLocalDate(); System.out.println("LocalDate : " + localDate); } }
Выход
ZonedDateTime : 2016-08-16T10:15:30+08:00 TimeZone : +08:00 LocalDate : 2016-08-16
8. Исключение DateTimeParseException
Если дата не может быть проанализирована, она вызовет Исключение DateTimeParseException
.
package com.mkyong.demo; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Locale; public class JavaDateExample8 { private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("d-MMM-yyyy", Locale.US); public static void main(String[] args) { try { LocalDate localDate = LocalDate.parse("16-ABC-2016", dtf); System.out.println(dtf.format(localDate)); } catch (DateTimeParseException e) { System.err.println("Unable to parse the date!"); //e.printStackTrace(); } } }
Выход
Unable to parse the date!
Рекомендации
- Форматирование даты и времени javadoc
- Классический простой формат данных javadoc
- Java – Как преобразовать строку в дату
- Stackoverflow: упрощенный формат данных, анализирующий данные с помощью ‘Z “буквальный
- Википедия: ISO 8601
- GMT ПРОТИВ UTC
- Что такое Часовой пояс?
- ISO_LOCAL_ДАТА
Оригинал: “https://mkyong.com/java8/java-8-how-to-convert-string-to-localdate/”