Java 返回错误值的字符串到日期转换

Java 返回错误值的字符串到日期转换,java,string,date,Java,String,Date,我正在尝试将字符串转换为日期。。。但返回值是错误的 String startDate = "2013-07-24"; Date date = new Date(); try{ DateFormat formatter = new SimpleDateFormat("yyyy-MM-DD"); date = (Date)formatter.parse(startDate); System.out.println(date); } catch(Ex

我正在尝试将字符串转换为日期。。。但返回值是错误的

String startDate = "2013-07-24";
Date date = new Date();
try{         
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-DD"); 
    date = (Date)formatter.parse(startDate);
    System.out.println(date);    
}
catch(Exception e){
    e.printStackTrace();
}
所需输出为:

2013年7月25日星期四00:00:00 CDT

但实际产出是:

2013年1月25日星期五00:00:00 CST

从7月到1月是怎样的?

我看到的一个问题是:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-DD"); 
应该是:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
DD
表示一年中的某一天。阅读本文了解更多信息。

将DD更改为DD

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 

DD
替换为
DD
,以匹配日期

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
按照

D一年中的某一天

d月份中的天


一个月的哪一天是用小写字母“d”表示的,而你用的是大写字母

将其更改为:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
它会起作用的

现代答案:

    String startDate = "2013-07-24";
    try {
        LocalDate date = LocalDate.parse(startDate);
        System.out.println(date);
    } catch (DateTimeParseException dtpe) {
        System.out.println(dtpe.getMessage());
    }
它打印的内容与输入字符串相同:

2013-07-24
您的字符串符合ISO 8601。这是被称为
Java.time
或JSR-310的现代Java日期和时间API本机“理解”的内容,因此不需要显式格式化程序。这也是类的
toString
方法通常产生的结果,这就是为什么您会得到相同的输出。如果希望以不同格式输出,请使用
DateTimeFormatter


我建议不要使用过时的
SimpleDateFormat
和朋友。你真正想要的是一个7月的日期,是一年中的第24天。显然,不存在这样的日期,而且通常,
SimpleDateFormat
会给你一些日期,然后假装一切正常。我无法计算由过时类的这种令人惊讶的行为所产生的堆栈溢出问题。现代API使用起来非常方便,并且在您出错时(我们显然都会这样做)会更加努力地告诉您。

它返回了正确的值。你的期望是错误的。