我正在尝试计算自特定日期以来经过的月份,该函数工作正常,尽管如果我将今天的日期与过去的不同年份放在一起,它会给我一个月的差异(不到一个月)。
假设对于所有日期,该函数都运行良好,除了:
如果今天是“2014-03-06”(YYYY、MM、DD),并且我将日期处理为“2006-03-06”,则结果会短一个月,但是如果我明天使用相同的日期,结果就好了。想知道我哪里出错了。下面是代码:
public static int months(String d) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = null;
try {
d1 = f.parse(d);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Date d2 = (getCurrentDate());
Date d2 = getCurrentDate();
Calendar c1 = Calendar.getInstance();
c1.setTime(d1);
Calendar c2 = Calendar.getInstance();
c2.setTime(d2);
int diff = 0;
if (c2.after(c1)) {
while (c2.after(c1)) {
c1.add(Calendar.MONTH, 1);
if (c2.after(c1)) {
diff++;
}
}
} else if (c2.before(c1)) {
while (c2.before(c1)) {
c1.add(Calendar.MONTH, -1);
if (c1.before(c2)) {
diff--;
}
}
}
System.out.println(diff);
return diff;
}
结果:95 个月。
理想情况下应该是 96 个月。
请不要考虑函数的静态性质,我已将此代码隔离在不同的项目中以进行测试。
这是 c1 和 c2 的值:
java.util.GregorianCalendar[time=1141583400000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Kolkata",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2006,MONTH=2,WEEK_OF_YEAR=10,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=65,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=19800000,DST_OFFSET=0] and c2 is: java.util.GregorianCalendar[time=1394044200000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Kolkata",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=2,WEEK_OF_YEAR=10,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=65,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=19800000,DST_OFFSET=0]
95
我的缺点是 getCurrentDate():
public static Date getCurrentDate() {
String DateStr = new SimpleDateFormat("yyyy-MM-dd"/*,
current*/).format(Calendar.getInstance().getTime());
// String DateStr = formattedDate;
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd"/*, current*/).parse(DateStr);
} catch (ParseException e) {
e.printStackTrace();
}
java.sql.Date dx = new java.sql.Date(date.getTime());
return dx;
}