| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 834 人关注过本帖
标题:请教一个关于Calendar类的问题
只看楼主 加入收藏
wubaodong
Rank: 1
来 自:辽宁
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-5
收藏
 问题点数:0 回复次数:1 
请教一个关于Calendar类的问题
为了把问题说的清楚些,不免显得很罗嗦,还请各位海涵,并请高手给予解答。

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]]
搜索更多相关主题的帖子: Calendar 
2008-05-05 16:08
wubaodong
Rank: 1
来 自:辽宁
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-5-5
收藏
得分:0 
干脆把我的源代码发上来。总之这个问题不解决,这一天都感觉不舒服。


<jsp:directive.page contentType="text/html;charset=GBK"pageEncoding="UTF-8" />
<%@ page import="*"%>
<%@ 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);  
    //要使calendar和calendarNextYear真正的被设置为需要的状态而必须加上的语句
    calendar.get(Calendar.DATE);
    calendarNextYear.get(Calendar.DATE);
   
    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((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>



红色的部分就是我提到的后加上的部分

[[it] 本帖最后由 wubaodong 于 2008-5-5 16:25 编辑 [/it]]
2008-05-05 16:20
快速回复:请教一个关于Calendar类的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016665 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved