日历月错了

我尝试在日历后的某些年份设置一个简单的日期:

字符串日期是此metod的参数。

SimpleDateFormat format = new SimpleDateFormat("dd.mm.yyyy"); String[] DateTimeParts = date.split(" "); String dt = DateTimeParts[0]; String[] dateParts = dt.split("-"); int d = Integer.parseInt(dateParts[2]); int y = Integer.parseInt(dateParts[0]); int m = Integer.parseInt(dateParts[1]); Calendar calendar = Calendar.getInstance(); calendar.set(y, m-1, d); calendar.add(Calendar.YEAR, years); return format.format(calendar.getTime()); } 

我的问题是日期返回没有其他问题,但是月份数字是完全错误的,并且每次运行似乎都变得越来越大! 我错过了什么?

当你使用大写的“M”时,你使用小写的“m”表示月份

 SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 

小写“m”用于格式化分钟 – 有关详细信息,请参阅SimpleDateFormat的Java API。

你必须使用大写月份,否则你得到分钟=)尝试:

 dd.MM.yyyy 

更多: http : //download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html

其他答案是正确的但过时的。

TL;博士

 LocalDate.parse( "23.01.2017" , DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) ) 

避免遗留日期时间类

仅供参考,麻烦的旧日期时间类如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在是遗留的 ,取而代之的是java.time类。 请参阅Oracle教程 。

LocalDate

LocalDate类表示没有时间且没有时区的仅日期值。

 DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd.MM.uuuu" ); LocalDate localDate = LocalDate.parse( "23.01.2017" , f ); // January 23, 2017. 

走向另一个方向。 请注意,与旧版类不同,java.time类具有合理的月份编号,1月至12月为1-12。

 LocalDate localDate = LocalDate.of( 2017 , 1 , 23 ); January 23, 2017. String output = localDate.format( f ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。