Метод разбора неправильно обрабатывает форматирование - PullRequest
0 голосов
/ 16 октября 2018

Мой код должен распечатать разницу между введенной датой и сейчас.Затем выходные данные будут отформатированы в соответствии с форматом ISO LocalDate.

Метод синтаксического анализа не обрабатывает форматирование правильно.

import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.io.*;
import java.time.*;

//Main class
public class TimeBetween{
public static void main(String[] args){
    String dateFormat = "MMMM d, yyyy";
    LocalDate aDate = null;
    boolean validStr = false;

 //parse method not handling formatting correctly.
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while(validStr==false){
        System.out.print("Enter a date: ");
//Try and catch 
        try {
            String dateEntered = br.readLine();
            aDate = LocalDate.parse(dateEntered,formatter);
            validStr = true;
        }catch(IOException | DateTimeParseException ex){
            validStr = false;
        }

    }

    System.out.println("Date entered was: "+aDate);
    LocalDate now = LocalDate.now(); 

    Period between;
    if(aDate.isBefore(now)){
        between = Period.between(aDate,now);
    }else{
        between = Period.between(now,aDate);
    }

    int years = between.getYears();
    int months = between.getMonths();
    int days =  between.getDays();

//Printing out year month and day differences
    System.out.println("There are"    +years+"years"+months+"months"+days+"days");
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

Введите месяц в регистре, используемом в вашей локали

Поскольку ваша программа стоит в вопросе, пользователь должен ввести месяц в ожидаемом регистре, например, в верхнем регистре F и в нижнем регистре ebruary дляфевраль.(Изменить :) Буква шаблона в верхнем регистре M используется для месяца, а строчная m означает минуты.Поэтому M s в строке шаблона формата должны быть в верхнем регистре, даже если вы не должны печатать месяц таким образом, и он также не форматируется в верхнем регистре, если вы форматируете дату обратно в строку.

Совет. Если синтаксический анализ с использованием средства форматирования не работает, попробуйте отформатировать значение с тем же средством форматирования, чтобы увидеть, как будет выглядеть ваша входная строка.Например:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern(dateFormat, Locale.forLanguageTag("en-IE"));
    System.out.println(LocalDate.now(ZoneId.of("Europe/Dublin")).format(formatter));

Пример вывода:

17 октября 2018

Здесь вы можете видеть, что месяц не в верхнем регистре.

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

Чтобы принять месяц в верхнем регистре

Я не думаю, что это было то, что вы хотели, но ради полноты: чтобы позволить месяцу вводиться всеми заглавными буквами, используйте DateTimeFormatterBuilder и егоparseCaseInsensitive метод, подобный следующему:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .parseCaseInsensitive()
            .appendPattern(dateFormat)
            .toFormatter(Locale.forLanguageTag("en-IE"));

С этим изменением приведен пример сеанса:

Enter a date: FEBRUARY 27, 1999
Date entered was: 1999-02-27
There are19years7months19days

Дата выводится в формате ISO 8601 для календарной даты.И я считаю, что расчет периода является правильным.

Ссылка

DateTimeFormatter документация , где вы можете увидеть строчные и прописные буквы образца и изучить разницу между m и M, d и D и y и Y.

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