Не могу избавиться от 'T' в LocalDateTime - PullRequest
0 голосов
/ 13 сентября 2018

Вот проблема:

    @GetMapping("/main/search")
    public String search (@RequestParam String departure,
                          @RequestParam String arrival,
                          @RequestParam String departureTime,
                          Model model) {

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

        List<BusFlight> busflights = busFlightService.search(departure, arrival, date);

Формат: 2015-10-23T03: 34: 40

Когда я пытаюсь решить проблему следующим образом:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
        departureTime+=" 00:00:00";  
        LocalDateTime date = LocalDateTime.parse(departureTime, formatter);
        String currentDate = date.format(formatter);

        List<BusFlight> busflights = busFlightService.search(departure, arrival, currentDate);

У меня проблема в другом месте. Java требует изменить тип LocalDateTime на тип String в моем сервисном каласе:

public List<BusFlight> search(String departure, String arrival, **LocalDateTime** departureTime)* 
{
    *LocalDateTime departureTimeTho = departureTime.**plusDays(1)**;*

И если я изменю LocalDateTime на String, метод не может использовать plusDays (1) : (((

И я тоже попробовал так:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
        departureTime+="T00:00:00";
        LocalDateTime date = LocalDateTime.parse(departureTime, formatter);

формат совпадает с символом 'T' 2018-09-13T05: 42: 28

Этот способ также не работает для меня:

 String localTime = "2018-09-13 00:00:00";
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
       LocalDateTime date = LocalDateTime.parse(localTime, formatter);
     String replace = date.toString().replace("T", " ");

, потому что нельзя изменить тип на String

И этот способ не работает из-за исключения: Неподдерживаемое поле: OffsetSeconds

String localdatetime = "2011-05-01";
        localdatetime+="T00:00:00";
        DateTimeFormatter date = DateTimeFormatter.ofPattern("yyyy-MM-ddXXX:mm:ss", Locale.US);
        LocalDateTime mzt = LocalDateTime.parse(localdatetime);
        System.out.println(mzt.format(date));

Пожалуйста, помогите! Как я могу решить проблему?

Пожалуйста, проверьте мои скриншоты для решения нерешенной проблемы

МОЙ КОНТРОЛЛЕР

МОЙ СЕРВИС

МОЙ Хранилище

МОЙ ФОРМАТ ДАННОГО ПАКЕТА

МОЙ ВИД

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Насколько я знаю, вы решили свою проблему по-своему.

Я предлагаю:

Вы можете использовать другой параметр, когда запрашиваете метод поиска.Другой параметр - DateTimeFormatter formatter, так что вы можете использовать свой путь:

LocalDateTime departureTimeTho = departureTime.plusDays(1);
String date = departureTimeTho.format(formatter)
0 голосов
/ 14 сентября 2018

В LocalDateTime нет T. Объекты даты и времени не имеют «формата».

С другой стороны, его метод toString неизменно создает строку с T в соответствии со стандартом ISO 8601 для текста, представляющего значения даты и времени. Вы не можете изменить ни метод toString, ни его поведение.

Чтобы избежать получения T, нужно избегать прямого или косвенного вызова метода toString. Это также означает: не печатайте объект LocalDateTime и не используйте его в конкатенации строк.

Факты, упомянутые до сих пор, не наносят вреда в коде, который вы опубликовали, поэтому я предлагаю вам научиться жить по нему.

РЕДАКТИРОВАТЬ: если я правильно прочитал первые два снимка экрана, связанные с вашими комментариями, они показывают, что ваш отладчик показывает ваш LocalDateTime объект с T в нем. Ваш отладчик тоже вызывает LocalDateTime.toString. Я никак не мог помешать моему отладчику сделать это и, следовательно, показать T, поэтому я не ожидаю, что он есть и у вас. Вы боретесь не с той проблемой. Я рекомендую вам прекратить это делать и научиться жить с этим.

Вы правы, что вы должны передать LocalDateTime в качестве последнего аргумента busFlightService.search (если вылет и прибытие также являются датами и / или временем, я предлагаю вам использовать для них подходящий тип даты / времени, а не строки). Так что вы можете использовать plusDays внутри метода (и аналогичные преимущества).

Если в какой-то момент вам нужно представить LocalDateTime пользователю, вы правы, что пользователь не хочет видеть T. Вы можете генерировать текст в любом формате, используя DateTimeFormatter. Этот класс может даже локализовать генерируемый текст для представления вашего LocalDateTime объекта.

    LocalDateTime dt = LocalDateTime.parse("2015-10-23T03:34:40");
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("ru"));
    System.out.println(dt.format(formatter));

Выход:

23 окт. 2015 г., 3: 34: 40

Теперь нет T (кроме т в окт.). Внутри вашей программы всегда используйте LocalDateTime или другой подходящий класс даты-времени. Только для презентации используйте строку.

Это разделение широко используется и рекомендуется в вычислительной технике: между вашей моделью и бизнес-логикой с одной стороны и пользовательским интерфейсом и презентацией с другой.

PS: Кроме того, если вы получаете время отправления в виде строки типа 2015-10-23 (гггг-ММ-дд), вам не нужно изменять строку, чтобы преобразовать ее в LocalDateTime. Либо используйте LocalDate, либо конвертируйте так:

    String departureTime = "2015-10-23";
    LocalDateTime dt = LocalDate.parse(departureTime).atStartOfDay();
0 голосов
/ 13 сентября 2018

Просто удалите тот T символ, который вы передали в качестве аргумента.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd**'T'**HH:mm:ss", Locale.US);

Для получения дополнительной помощи вы можете получить помощь по этой ссылке https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

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