使用SimpleDateFormat.parse时错误的月份

在我的程序中有一个非常奇怪的问题。 在这里你可以看到String birthdayLog来检查它:

 birthday = String.valueOf(birthYear) + "-" + String.valueOf(birthMonth) + "-" + String.valueOf(birthDay); Log.i(TAG, "Birthday: " + birthday) 

然后我把它放到SimpleDateFormat并用Log检查它:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); Date birthDate = sdf.parse(birthday); Log.i(TAG, "Birth date : " + birthDate); 

然后在Logcat我有:

 I/App﹕ Birthday: 1999-10-15 I/App﹕ Birth date: Fri Jan 15 00:10:00 GMT+04:00 1999 

正如你在日期看到的那样是Jan ,但是在String中它是10所以日期应该是这样的:

 Fri Nov 15 00:10:00 GMT+04:00 1999 

我的错误在哪里?

PS我认为我的问题与使用SimpleDateFormat.parse()时获取错误数据有某种联系

使用:

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

使用MM表示月份mm表示分钟,如文档所述 …

如果要以特定格式打印Date ,则应使用:

  sdf.format(birthday) 

或者另一个SimpleDateFormat如果你想以不同的格式pring它…

ThreeTenABP

我想提供2017年答案。 对于Android,首先获得ThreeTenABP库。 说明在这个问题:如何在Android项目中使用ThreeTenABP 。 然后剩下的就像:

  LocalDate birthDate = LocalDate.of(birthYear, birthMonth, birthDay); System.out.println("Birth date : " + birthDate); 

这打印:

 Birth date : 1999-10-15 

如果您将月份,月份和日期作为数字,则无需进行任何解析,这只会使事情复杂化。

ThreeTenABP是java.time或JSR-310的java.time ,现代Java日期和时间API,是Android Java 7.如果您使用的是Java 8或更高版本,则java.time是内置的。 (非Android)Java 6和7还有一个后端口 : ThreeTen Backport 。

我遇到了同样的问题,现在我发现了错误。 我们应该使用MM表示月份, mm表示分钟, dd表示日期。 使用DD将我的日期更改为错误的月份,因此我将dd用于白天,因此我使用的最终格式是yyyy-MM-dd