Java 设置输入日期并将其添加到列表中

Java 设置输入日期并将其添加到列表中,java,simpledateformat,date-parsing,Java,Simpledateformat,Date Parsing,基本上,我想设置日期并将其保存到列表中。我的代码如下: public List<RecordList> createRecord(BigDecimal yr){ for (int index = 0; index <= 14; index++) { RecordList value = new RecordList(); if(index == 0){ value.setStartDt(toDate(("01-0

基本上,我想设置日期并将其保存到列表中。我的代码如下:

public List<RecordList> createRecord(BigDecimal yr){

    for (int index = 0; index <= 14; index++) {
        RecordList value = new RecordList();
        if(index == 0){
            value.setStartDt(toDate(("01-04-" + yr)));
            value.setEndDt(toDate(("30-04-" + yr)));
        }
        if(index == 1){
            value.setStartDt(toDate(("01-05-" + yr.add(new BigDecimal(1)))));
            value.setEndDt(toDate(("31-05-" + yr.add(new BigDecimal(1)))));
        }
        createRecord.add(newRecordValue);
    return createRecord;
}

private Date toDate(String date) {
    Date newDate = null;
    try {
        newDate = new SimpleDateFormat("dd-MM-YYYY").parse(date);
    }
    catch (ParseException e) {
        e.printStackTrace();
    }
    return newDate;
}
它不会增加到明年,而是减少到:

"StartDate": "30-12-2016",
 "EndDate": "30-12-2016"

大写Y为周-年。日历年必须使用小写y:

newDate = new SimpleDateFormat("dd-MM-yyyy").parse(date);

有关更多信息,请阅读的Javadoc中的@Jens的答案是正确的,应该接受

我添加了一些如何改进错误处理的建议。正如您所看到的,
SimpleDateFormat
对代码的错误保持沉默。我敢肯定,这种行为已经导致许多人发布了大量解析代码,有时会出现“令人惊讶”的行为。幸运的是,你只是碰巧发现出了点问题


Java-8

新的内置库
java.time
(从java-8开始提供)不会解析,但会引发异常

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-YYYY");
LocalDate d = LocalDate.parse("30-12-2017", dtf);
出现以下错误消息:

线程“main”java.time.format.DateTimeParseException中的异常: 无法分析文本“30-12-2017”:无法获取LocalDate 来自临时助理:{MonthOfYear=12, WeekBasedyar[WeekFields[星期一,4]]=2017,DayOfMonth=30}

错误消息中字段“WeekBasedYear”的存在应该会告诉您出了什么问题,因此您可以查看文档以查找正确的模式符号

顺便说一句,Java-6+7还提供了一个后端端口Three-Ten BP。我现在还测试了流行的库Joda Time:

DateTimeFormatter dtf = DateTimeFormat.forPattern("dd-MM-YYYY");
System.out.println(dtf.parseLocalDate("30-12-2017")); // 2017-12-30 (don't use it!)
因此,Java-8也是对Joda Time的改进,它在您的模式中没有发现任何问题


我的图书馆

ChronoFormatter cf=
日期模式的计时格式(“dd-MM-yyy”,PatternType.CLDR,Locale.ROOT);
LocalDate d=cf.parse(“30-12-2017”).toTemporalAccessor();//甚至没有执行
在这里,解析器的构造失败,并显示以下消息:

java.lang.IllegalArgumentException:
Y作为基于周的年份需要周日期格式:dd-MM-yyy


哦,使用JSR-310中的
LocalDate
(内置Java8,也后端口到Java6和Java7),这将更容易、更自然。现在,您不应该使用
SimpleDateFormat
,尤其是对于这样的任务。
DateTimeFormatter dtf = DateTimeFormat.forPattern("dd-MM-YYYY");
System.out.println(dtf.parseLocalDate("30-12-2017")); // 2017-12-30 (don't use it!)
ChronoFormatter<PlainDate> cf =
    ChronoFormatter.ofDatePattern("dd-MM-YYYY", PatternType.CLDR, Locale.ROOT);
LocalDate d = cf.parse("30-12-2017").toTemporalAccessor(); // not even executed