我做了一个小计划来计算几天。计算从5月22日起的150天。但结果是十月十八日。实际日期是10月19日。任何人都可以帮我找到我的代码有什么问题。
Calendar mine = new GregorianCalendar(2013, Calendar.MAY,22);
int month = Calendar.MAY;
int counter = 0;
for(int i=mine.get(Calendar.DAY_OF_MONTH);i<=mine.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
System.out.println("i "+i);
counter++;
System.out.println("counter "+counter);
if(i==mine.getActualMaximum(Calendar.DAY_OF_MONTH)){
month++;
i=1;
mine.set(2013, month, i);
counter++;
System.out.println("i "+i+" "+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH));
if(counter == 150){
System.out.println("day "+i+ counter +"days"+ "month:"+ mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH));
break;
}
}
if(counter == 150){
System.out.println("i "+i+" counter "+ counter +" date:"+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH));
break;
}
}
答案 0 :(得分:3)
您可以使用add
Calendar
功能
Calendar mine = new GregorianCalendar(2013, Calendar.MAY,22);
mine.add(Calendar.DAY_OF_YEAR, 150);
System.out.println(mine.getTime());
将打印
Sat Oct 19 00:00:00 IST 2013
但您的代码存在的真正问题是,您首先递增counter
,然后与150
进行比较。
这样做,它应该修复你的代码
if(counter == 150){
System.out.println("i "+i+" counter "+ counter +date:"+mine.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH));
break;
}
counter++;
答案 1 :(得分:2)
或者您可以使用Joda DateTime:
import org.joda.time.DateTime;
....
System.out.println(new DateTime("2013-05-22").plusDays(150));
答案 2 :(得分:2)
LocalDate.of( 2013, Month.MAY, 22 )
.plusDays( 150 )
现代java.time课程更容易。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
Month
enum提供了十几个预定义的对象,一年中每个月都有一个。
LocalDate ld = LocalDate.of( 2013, Month.MAY, 22 ) ;
LocalDate later = ld.plusDays( 150 );
请参阅this code live at IdeOne.com。
2013年10月19日
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。