Как преобразовать 2017-08-01T16: 00: 00-04: 00 в метку времени в Java? - PullRequest
0 голосов
/ 09 января 2020

Я хочу преобразовать дату из формата даты по умолчанию в метку времени в Java. Я попробовал следующий код, но он не работает:

String string = "2017-08-01T16:00:00-04:00";
DateTimeFormatter formatter = 
                  DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss-mm:ss");
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date);

java .time.format.DateTimeParseException: Text '2017-08-01T16: 00: 00-04: 00 не удалось проанализировать с индексом 20

в java .time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter. java: 1949) в java .time.format.DateTimeFormatter.parse (DateTimeFormatter. java: 1851) в java .time.LocalDate.parse (LocalDate. java: 400)

1 Ответ

4 голосов
/ 09 января 2020

Не используйте LocalDate для String, который

  1. содержит информацию о времени суток, для которого потребовалось бы LocalDateTime и
  2. . смещение, которое не может рассматриваться как LocalDateTime.

Вместо этого используйте OffsetDateTime:

public static void main(String[] args) {
    String string = "2017-08-01T16:00:00-04:00";
    OffsetDateTime odt = OffsetDateTime.parse(string);
    System.out.println(odt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
}

Выход:

2017-08-01T16:00:00-04:00

Кроме того, ваш шаблон в DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss-mm:ss"); имеет серьезный fl aws, как дубликаты.

Вы, конечно, можете распечатать результат, используя шаблон, отличный от входного (который соответствует стандарту ISO 8601):

public static void main(String[] args) {
    String string = "2017-08-01T16:00:00-04:00";
    OffsetDateTime odt = OffsetDateTime.parse(string);
    System.out.println(odt.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss Z")));
}

Вывести на этот раз:

01.08.2017 16:00:00 -0400
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...