Java SimpleDateFormat解析错误的日期

时间:2014-04-29 12:04:23

标签: java parsing java-7 simpledateformat

我正在尝试使用SimpleDateFormat的解析功能将String转换为Date

    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-YYYY");

    String strInput1 = "29-04-2014";
    System.out.println("string 1: " + strInput1);

    Date date1 = new Date();
    try {
        date1 = sdf.parse(strInput1);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("date 1: " + date1.toString());

    String strInput2 = sdf.format(date1);
    System.out.println("string 2: " +strInput2);

    Date date2 = new Date();
    try {
        date2 = sdf.parse(strInput2);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("date 2 " + date2);

date1的输出为Mon Dec 30 00:00:00 GMT 2013,然后正确解析为30-12-2014

我认为错误是在初始化sdf时的某个地方。

2 个答案:

答案 0 :(得分:7)

您正在使用周年<{1}} 。您的意思是YYYY,即

只需将格式更改为:

yyyy

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 格式说明符很少使用,当 使用时,它应与YYYY / E一起使用(星期几)姓名/号码)和u(一周中的一周)。

请注意,您还应考虑设置w的时区...此外,如果您使用的是Java 8,请使用SimpleDateFormat包,否则{{3是一个比java.time等更清晰的库。

答案 1 :(得分:0)

现代Java数据&amp; JSR-310中定义的时间API几乎是在问这个问题的时候出现的,所以我认为现在是时候回答它了。为了示例和解释,我们首先尝试保留不正确的格式模式字符串:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-YYYY");

    String strInput1 = "29-04-2014";
    System.out.println("string 1: " + strInput1);

    LocalDate date1 = LocalDate.parse(strInput1, dtf);

    System.out.println("date 1: " + date1.toString());

尝试解析strInput1会产生java.time.format.DateTimeParseException: Text '29-04-2014' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=29, MonthOfYear=4, WeekBasedYear[WeekFields[SUNDAY,1]]=2014},ISO of type java.time.format.Parsed。一方面,我认为例外是向前迈出的一步,而不是像你所经历的那样产生错误的日​​期。另一方面,如果没有更深入的新类知识,异常消息就不容易阅读。需要注意的是“WeekBasedYear”。这仅适用于周数,因此将其视为错误的标志。然后与the documentation进行比较。它表示u表示年份,小写y表示年份,大写Y表示基于周的年份。假设一年将永远处于共同时代(“anno domini”),我们可以采用uy

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-uuuu");

现在代码打印出来了:

string 1: 29-04-2014
date 1: 2014-04-29

我们还可以将日期格式化回字符串,当然:

    String strInput2 = date1.format(dtf);
    System.out.println("string 2: " +strInput2);

结果是我们从预期开始的字符串:

string 2: 29-04-2014

请注意,现代API附带一个LocalDate类,用于没有时间的日期。在这种情况下,这会更精确地模拟您的需求,并避免因在Date对象中拖动时间而导致的各种极端情况。

问题:我可以在Java 7中使用它吗?你当然可以。对于Java 6和7,获取ThreeTen Backport并开始使用现代类。