Невозможно проанализировать дату, используя DateTimeFormatter - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь проанализировать возвращенную мне строку даты из БД в LocalDate, используя DateTimeFormatter. Я получаю следующее исключение.

String date = "2018-05-16 03:39:13.0";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime localDate= LocalDateTime.parse(date , formatter);

java.time.format.DateTimeParseException: Text '2018-05-16 03:39:13.0' could not be parsed at index 20
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) [rt.jar:1.8.0_171]
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) [rt.jar:1.8.0_171]
        at java.time.LocalDateTime.parse(LocalDateTime.java:492) [rt.jar:1.8.0_171]

Однако приведенный ниже код работает.

String date = "2018-05-16 03:39:13.0";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date newDate= formatter.parse(date);

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Так как вы используете доли секунды с фиксированной длиной 3, он не может быть проанализирован только с одной цифрой.Лучше использовать DateTimeFormatterBuilder и реализовать переменную долю секунды.

String date = "2018-05-16 03:39:13.0";

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendPattern("yyyy-MM-dd HH:mm:ss")
    .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
    .toFormatter();

LocalDateTime localDate = LocalDateTime.parse(date, formatter);
System.out.println(formatter.format(localDate));

Это также можно сделать с помощью необязательных полей для получения переменной длины доли секунды:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSS][.SS][.S]");
0 голосов
/ 16 мая 2018

Если ваше намерение состоит в том, чтобы просто проанализировать String до LocalDateTime, это будет нормально работать.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
0 голосов
/ 16 мая 2018

Ну, это может сделать вашу работу.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormateer {
    public static void main(String[] args) throws ParseException{
        String date = "2018-05-16 03:39:13.0";      
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.a", Locale.US);
        Date newDate= formatter.parse(date);
        String date1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.a", Locale. getDefault()). format(newDate);
        Date t=ft.parse(date1);
        ft.applyPattern("yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println(date);
        System.out.println(ft.format(t));
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...