日期:2014-05-20  浏览次数:20903 次

诚求解释
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class Zuoye {

public static void main(String[] args) throws ParseException {
Zuoye z=new Zuoye();
z.specDate("2011-3-22", 3);
}

void specDate(String generateDate, int period) throws ParseException{
String s="yyyy-MM-dd";
SimpleDateFormat sdf=new SimpleDateFormat(s);
Date date=sdf.parse(generateDate); //将String对象变换为Date类型
Calendar cal=Calendar.getInstance();
cal.setTime(date); //将Date转换为Calendar

cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)+period); //将月份加往后推三个月
int i=cal.get(Calendar.DAY_OF_MONTH)-14;

cal.set(Calendar.DAY_OF_MONTH,i );
//System.out.println(cal.getTime());
cal.set(GregorianCalendar.DAY_OF_WEEK, Calendar.FRIDAY);//将日期变为所在日期的周五
System.out.println(cal.getTime());
}
}


------解决方案--------------------
显然,根据程序的意思,打印Fri Jun 21 00:00:00 CST 2012,这个结果是错的,因为当前日期22-14之后应该打印8才对,但是却不是,而加上System.out.println(cal.getTime());之后,结果是正确的。
那是什么造成了前后差别那么大呢,这个我好好查了一下,原来在 Calendar 的方法中Set()之后,set的结果是不会立马刷新的,及时使用Thread.sleep()也无用,必须调用getTime()或者add()方法才会让 Calendar 立刻刷新。
所以楼主,这个问题与打印不打印无关,而是刷新的问题,不信可以将System.out.println(cal.getTime());换成其他的比如cal.get(Calendar.MILLISECOND),一样可以得到正确的结果