请教一个关于Calendar类的问题
[size=5][color=Red]为了把问题说的清楚些,不免显得很罗嗦,还请各位海涵,并请高手给予解答。[/color][/size]1,Calendar calendar=Calendar.getInstance();
2,calendar.set(year,11,26);
3,DateUtil.getFirstDateOfWeek(calendar);
首先:year是一个INT型数据
然后:DateUtil.getFirstDateOfWeek(Calendar c)是一个自己写的方法,作用是得到c所在周的第一天,返回的也是个Calendar类型的对象。最重要的是我对灯发誓这个方法是正确的(自己用的测试方法,在操作系统中直接改变系统时间,随机设置20个不同时间,然后
Calendar calendar=Calendar.getInstance();
DateUtil.getFirstDateOfWeek(calendar);
结果都是正确的。)
最后:就是我遇到的问题了,看我的代码大家可以知道,我的目的是得到某一年的12月26日这一天所在周的第一天。可是如果只有这3行代码,那么结果是错误的(再次对灯发誓,DateUtil.getFirstDateOfWeek(Calendar c)这个方法是对的),比如year为2007,最后结果2007-12-3,而不是我想得到的结果2007-12-24。year为2005,结果是2005-12-5,而不是我想要的2005-12-26。等等。总之得不到想要的结果,并且这个错误的结果也有点规律——总比想要的结果早2到3周,而且也是个周一,所以觉得是在执行DateUtil.getFirstDateOfWeek(Calendar c)方法时带入的参数有问题,既calendar.set(year,11,26); 这条语句没有成功的设calendar,
所以在原来的第2和第3行中间加上一条测试语句
System.out.println(DateUtil.getDateString(calendar));
(其中Util.getDateString(Calendar c)也是个自己写的可将Calendar类对象转化为String型的方法,也保证100%没问题并同时保证在方法中没有对传入的参数做任改变。)
总之是加上了这么一条,目的本是测试下calendar.set(year,11,26); 后的calendar的值,结果是正确的,既输出的结果确实是某年的12月26日。感觉有点蒙,参数正确,方法正确,可结果却是错误的。
之后顺手刷新了下页面(我写的是一个JSP),突然发现这时的结果居然是正确的。迷糊了几秒钟之后想了想,代码没做过修改,之是加了
System.out.println(DateUtil.getDateString(calendar));这么一条输出语句而已啊。结果证明,不写上这句结果是错误的,加上了就正确了。之后又发现可以用 calendar.get(Calendar.DATE);来代替这条输出语句,可起到同样的作用。
总结了一下,出错的地方找到了,可是原因却使我迷糊了。最后得出个可能的结论。在calendar.set(year,11,26); 后calendar的状态可能没有真正的被设置,也许还处在一种中间状态,这里我大胆的类比一下,就象是输出流在输出数据时那样,数据先被放在了缓冲区中,最后一定要FLUSH下才可以。
而后来加上的不管是System.out.println(DateUtil.getDateString(calendar));还是calendar.get(Calendar.DATE);可能都在起到一种类似FLUSH的作用。
不过这只是我自己初步的想法,而来这里的目的就是要得到真正的答案。
[[it] 本帖最后由 wubaodong 于 2008-5-5 16:26 编辑 [/it]]
<jsp:directive.page contentType="text/html;charset=GBK"pageEncoding="UTF-8" />
<%@ page import="cn.com.gei.kmp.core.util.*"%>
<%@ page import="java.util.Calendar" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.DateFormat" %>
<%
//最后要显示年份的第一天,规则为当年的前一年12月26日所在周的第一天。之后在循环显示中calendar代表每次要显示周的第一天(周一)
Calendar calendar=Calendar.getInstance();
//循环显示中代表要显示周的最后一天(周日)
Calendar calendarNext=Calendar.getInstance();
//要显示年份后一年的第一天,规则同calendar
Calendar calendarNextYear=Calendar.getInstance();
//当前年份,用于显示列表框
int thisYear=calendar.get(Calendar.YEAR);
//要显示的年份
int showYear=thisYear;
String showYearString=Integer.toString(showYear);
//要显示年的前一年,既要显示年的第一天所在的年份
int year = showYear-1;
String yearString = Integer.toString(year);
if(request.getParameterValues("yearString")!=null){
showYearString=request.getParameterValues("yearString")[0];
showYear=Integer.parseInt(showYearString);
year=showYear-1;
yearString = Integer.toString(year);
}
//根据year,showYear设置calendar,calendarNextYear
calendar.set(year,11,26);
calendarNextYear.set(showYear,11,26);
[color=Red] //要使calendar和calendarNextYear真正的被设置为需要的状态而必须加上的语句
calendar.get(Calendar.DATE);
calendarNextYear.get(Calendar.DATE);[/color]
String weekBeginDateString = DateUtil.getFirstDateOfWeek(calendar);
String weekBeginDateStringNextYear = DateUtil.getFirstDateOfWeek(calendarNextYear);
String weekBeginDateStrings[] = weekBeginDateString.split("-");
String weekBeginDateStringsNextYear[] = weekBeginDateStringNextYear.split("-");
int tempYear = Integer.parseInt(weekBeginDateStrings[0]);
int tempMonth = Integer.parseInt(weekBeginDateStrings[1]) - 1;
int tempDay = Integer.parseInt(weekBeginDateStrings[2]);
int tempYearNextYear = Integer.parseInt(weekBeginDateStringsNextYear[0]);
int tempMonthNextYear = Integer.parseInt(weekBeginDateStringsNextYear[1]) - 1;
int tempDayNextYear = Integer.parseInt(weekBeginDateStringsNextYear[2]);
calendar.set(tempYear, tempMonth, tempDay);
calendarNext.set(tempYear, tempMonth, tempDay);
calendarNextYear.set(tempYearNextYear, tempMonthNextYear, tempDayNextYear);
%>
<br/>
<form action="lookPlanByWeekView" method="post">
<font size="4" class="viewtitle"><b>选择年份</b></font>
<select name="yearString" onchange="javascript:this.parentNode.submit()">
<%
for(int i=2003;i<=thisYear;i++){
String thisShowYearString=Integer.toString(i);
if(i==showYear){
%>
<option value="<%=thisShowYearString%>" selected><%=i%>年</option>
<%
}
else{
%>
<option value="<%=thisShowYearString%>"><%=i%>年</option>
<%
}
}
%>
</select>
</form>
<hr align="left" width="98%">
<div align="center"><h3><%=Integer.toString(showYear)%>年 公司计划周度索引</h3></div>
<table style="TEXT-ALIGN: center;border-collapse:collapse;" border="1" align="center">
<%
//每行显示数
int number=6;
for(int i=0;;i++){
calendarNext.add(Calendar.DAY_OF_MONTH, 6);
if(calendarNext.compareTo(calendarNextYear)<0){
String thisBeginDate=DateUtil.getStringFromCalendar(calendar);
String thisEndDate=DateUtil.getStringFromCalendar(calendarNext);
if(i%number==0){
%>
<tr>
<%
}
%>
<td>
<a target="_blank" href="companyWeekPlans?currentDate=<%=thisBeginDate%>" >
<font size=3><%=showYearString%>年 第<%=(i+1)%>周</font>
<br/>
</a>
(<%=thisBeginDate%>~<%=thisEndDate%>)
</td>
<%
if(i%number==(number-1)){
%>
</tr>
<%
}
calendar.add(Calendar.DAY_OF_MONTH, 7);
calendarNext.add(Calendar.DAY_OF_MONTH, 1);
}
else
break;
}
%>
</table>
[color=Red][size=5]红色的部分就是我提到的后加上的部分[/size][/color]
[[it] 本帖最后由 wubaodong 于 2008-5-5 16:25 编辑 [/it]]
页:
[1]
