当前位置: 代码迷 >> J2SE >> 新人第一次发帖。java日历程序有关问题,求教各路大神,不胜感激
  详细解决方案

新人第一次发帖。java日历程序有关问题,求教各路大神,不胜感激

热度:103   发布时间:2016-04-23 20:23:01.0
新人第一次发帖。java日历程序问题,求教各路大神,不胜感激!
本帖最后由 dyw3390199 于 2014-08-20 16:58:51 编辑
程序是这样的:
import java.util.*;
public class DateDemo0
{
    public static void main(String[] args) 

    {
        GregorianCalendar d = new GregorianCalendar();
        //输出当前时间的一串字符
       
         System.out.println(d);

//把当前时间设置为这个月的第一天
        d.set(Calendar.DAY_OF_MONTH,1);

//打印更改后的字符串作对比,发现DAY_OF_MONTH=1了,但是DAY_OF_WEEK还是等于4
        System.out.println(d);
        
         //为刚才的更改赋值,weekday表示更改后这个月第一天星期几(这时候因为已经把d设置成这个月一号了,即8.1,是星期五,所以weekday应该得到6,下面打印出来也确实如此。但是前面一条打印语句中DAY_OF_WEEK明明显示的是=4!为什么现在却能打印出来6???)monthday代表这个月第一天是几号
        int weekday = d.get(Calendar.DAY_OF_WEEK);
        int monthday = d.get(Calendar.DAY_OF_MONTH);

//把d向前推一天
        d.add(Calendar.DAY_OF_MONTH,-1);

//同上,赋值,这次调用add方法以后DAY_OF_WEEK改变了,现在是5,代表上个月周四,7月31日确实是周四,吻合。我很奇怪为什么同样是对d操作,第一个set方法只改变其中一个状态的值,但是却能得到和改变后的值不一样的结果(比如上面的打印出来DAY_OF_WEEK是6而不是4)而add却把整个值都改变了
        int weekday2 = d.get(Calendar.DAY_OF_WEEK);    
        int monthday2 = d.get(Calendar.DAY_OF_MONTH);

        System.out.println(d);
        System.out.println("这个月的第一天星期几:"+weekday);
        System.out.println("这个月的第一天多少号:"+monthday);
        System.out.println("往前推一天星期几:"+weekday2);
        System.out.println("往前推一天多少号:"+monthday2);
    }

}
各位大神这是为什么呀?谁解答一下,多谢了!!!
下面是程序运行结果:
java.util.GregorianCalendar[time=1408525119796,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=4,DAY_OF_MONTH=20,DAY_OF_YEAR=232,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=58,SECOND=39,MILLISECOND=796,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=7,WEEK_OF_YEAR=34,WEEK_OF_MONTH=4,DAY_OF_MONTH=1,DAY_OF_YEAR=232,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=58,SECOND=39,MILLISECOND=796,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1406797119796,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=31,WEEK_OF_MONTH=5,DAY_OF_MONTH=31,DAY_OF_YEAR=212,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=58,SECOND=39,MILLISECOND=796,ZONE_OFFSET=28800000,DST_OFFSET=0]
这个月的第一天星期几:6
这个月的第一天多少号:1
往前推一天星期几:5
往前推一天多少号:31

------解决方案--------------------

d.set(Calendar.DAY_OF_MONTH, 1);
之后调用一下
d.getTime();
就可以了,具体看看java的源码吧。
------解决方案--------------------
引用:

d.set(Calendar.DAY_OF_MONTH, 1);
之后调用一下
d.getTime();
就可以了,具体看看java的源码吧。


从Calendar.java的源码中可以看到,在set方法中,将isTimeSet设置成false

public long getTimeInMillis() {
        if (!isTimeSet) {
    updateTime();
}
        return time;
    }

而只有调用了computeTime之后才会给各个field赋值,这么做应该是为了提高性能吧。
  相关解决方案