日期字符串解析问题(由于从0到11的月份)

时间:2011-08-31 12:58:54

标签: java date simpledateformat

代码

    String strDate = "2010-12-01";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
    Date parsedDate = sdf.parse(strDate);
    System.out.println(parsedDate);

将依赖您的语言环境生成以下输出:

Fri Jan 01 00:12:00 CET 2010

日期没有正确解析,因为我期待的是1月12日而不是1月1日。 我知道,月份从0到11编号,所以12月份变成了0月。

我有几种解决方案可以解决这个问题,但是所有这些解决方案都会产生至少3-4行代码。所以我的问题是:

解决这个“问题”最好的方法是什么?

我无法想象解析一个简单的日期需要超过2-3行......

//编辑:对我这个问题感到羞耻。原谅我。 thx伙计

3 个答案:

答案 0 :(得分:9)

yyyy-mm-dd更改为yyyy-MM-dd


M   Month in year   Month   July; Jul; 07  

m   Minute in hour  Number  30

参见

答案 1 :(得分:5)

您的日期格式不正确:月份为MM(不是mm,这是几分钟)。试试这个:

"yyyy-MM-dd"

你获得1月份的原因是你没有给解析器一个月(你给了年 - 分钟)。 1月,即第一个月,如果输入未提供,则为分配给日期的默认月份。 12被解析为分钟字段(相当明显)

答案 2 :(得分:0)

  

解决这个问题最好的方法是什么"?

使用不同的课程。您正在使用麻烦的旧遗留类。而是使用java.time类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。它明智地计算数月,1-12是1月到12月。

您的输入字符串已采用ISO 8601格式之一。默认情况下,这些标准格式在java.time类中使用。所以不需要定义格式化模式。

LocalDate localDate = LocalDate.parse( "2010-12-01" );

Month

另请查看方便的Month枚举。

Month month = Month.of( 1 ); // January = 1, December = 12.