【问题标题】:Set input date and add it to list [duplicate]设置输入日期并将其添加到列表中[重复]
【发布时间】:2017-06-08 08:18:52
【问题描述】:

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

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"

【问题讨论】:

  • 哦,使用 JSR-310 中的 LocalDate(Java 8 内置,也向后移植到 Java 6 和 7)会更容易、更自然。这些天你不应该使用SimpleDateFormat,尤其不应该用于这样的任务。

标签: java simpledateformat date-parsing


【解决方案1】:

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

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

更多信息请阅读SimpleDateFormat的Javadoc

【讨论】:

    【解决方案2】:

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

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


    Java-8

    新的内置库java.time(从Java-8 开始可用)不会解析而是抛出异常

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

    带有以下错误消息:

    线程“主”java.time.format.DateTimeParseException 中的异常: 无法解析文本“30-12-2017”:无法获取 LocalDate 来自 TemporalAccessor: {MonthOfYear=12, WeekBasedYear[WeekFields[MONDAY,4]]=2017, DayOfMonth=30}...

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

    顺便说一句,还有一个用于 Java-6+7 的 backport 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 2021-08-13
      • 2012-05-06
      • 2013-11-18
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多