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

时间:2017-06-08 08:18:52

标签: 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-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;
}

当我将年份设置为2017年时,输出与我设置的内容不匹配:

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

并且它不会增加到明年,而是递减到:

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

2 个答案:

答案 0 :(得分:5)

大写Y是周年。您必须在日历年中使用小写y:

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

有关更多信息,请阅读SimpleDateFormat

的Javadoc

答案 1 :(得分:2)

@Jens的答案是正确的,应该被接受。

我添加了一些建议如何改进错误处理。如您所见,SimpleDateFormat对您的代码有什么问题保持沉默。我确信这种行为已经导致许多人有时会发布大量的解析代码&#34;令人惊讶的&#34;行为。幸运的是,您发现偶然表示出现了问题。

<强>的Java-8

新的内置库java.time(自Java-8以来可用)不会解析但抛出异常

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-YYYY");
LocalDate d = LocalDate.parse("30-12-2017", dtf);

以下错误消息:

  

线程中的异常&#34; main&#34; java.time.format.DateTimeParseException:   文字&#39; 30-12-2017&#39;无法解析:无法获取LocalDate   来自TemporalAccessor:{MonthOfYear = 12,   WeekBasedYear [WeekFields [星期一,4]] = 2017,DayOfMonth = 30} ...

该领域的存在&#34; WeekBasedYear&#34;在错误消息中应该启发你有什么问题,所以你去文档寻找正确的模式符号。

顺便说一句,还有一个可用于Java-6 + 7的反向端口Threeten-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的改进,它没有在你的模式中看到任何问题。

我的图书馆Time4J

ChronoFormatter<PlainDate> cf =
    ChronoFormatter.ofDatePattern("dd-MM-YYYY", PatternType.CLDR, Locale.ROOT);
LocalDate d = cf.parse("30-12-2017").toTemporalAccessor(); // not even executed

此处解析器的构造失败,并显示以下消息:

  

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