解析方法无法正确处理格式

时间:2018-10-16 10:27:28

标签: java oop datetime

我的代码应该可以打印出输入日期和现在之间的差额。然后将根据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 :(得分:0)

在您的语言环境中使用的情况下输入月份

当您的程序出现问题时,要求用户以预期的情况输入月份,例如,2月的大写F和小写的ebruary。 (编辑:)模式字母大写M用于月份,而小写m表示分钟。因此,即使不应该以这种方式键入月份,格式模式字符串中的M也必须使用大写,并且如果将日期格式化为字符串,则也不能使用大写格式。

提示:使用格式化程序进行解析无法正常工作时,请尝试使用相同的格式化程序格式化值,以查看输入字符串的外观。例如:

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

示例输出:

  

2018年10月17日

在这里您可以看到月份不是大写。

提示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 documentation,您可以在其中看到大写和小写字母,并研究mMdD和{{1 }}和y