A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵庆礼 中级黑马   /  2012-6-28 13:14  /  1646 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由  赵庆礼 于 2012-6-28 17:46 编辑

我写了一个方法,用于获得当前周一的时间。这个方法是按照中国人的习惯,如果当前是周日,则获得6天前周一的时间。
方法体如下:
       Calendar c = Calendar.getInstance();
        int day = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(day);
        System.out.println(c.get(Calendar.DAY_OF_YEAR));
        if (day == 1)
       {
            c.set(Calendar.DAY_OF_YEAR, c.get(Calendar.DAY_OF_YEAR) - 7);
            //System.out.println(c.getTime());
         }
        c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        System.out.println(c.getTime());
如果当前时间为周日,则得到的还是下周一的时间,即当前时间第二天的时间。
当我把注释掉的System.out.println(c.getTime());让它执行时,程序得到的是我想要的结果,即,当前是周日,得到的是6天前周一的时间。

3 个回复

倒序浏览
/*
                 * 原因:javadoc中对Calendar的字段操作有说明:字段操作 可以使用三种方法更改日历字段:set()、add() 和
                 * roll()。 set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f
                 * 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用
                 * get()、getTime()、getTimeInMillis()、add() 或 roll()
                 * 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set()
                 * 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f)
                 * 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。 示例:假定 GregorianCalendar
                 * 最初被设置为 1999 年 8 月 31 日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER)
                 * 将该日期设置为 1999 年 9 月 31 日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1
                 * 日的一个暂时内部表示。但是,在调用 getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30)
                 * 会将该日期设置为 1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。 add(f, delta) 将
                 * delta 添加到 f 字段中。这等同于调用 set(f, get(f) + delta),但要带以下两个调整:
                 *
                 * Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于 delta,以字段 f
                 * 中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。 Add 规则
                 * 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f
                 * 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改
                 * ,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比
                 * DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。
                 *
                 * 此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
                 */

点评

警告第一次,你的帖子涉嫌违规,我讲检查你的所有回帖,情节严重的话,将会扣分,如果引用他人文章,请注明,这将不会被视为违规。  发表于 2012-6-28 17:01
回复 使用道具 举报
意思就是说 你虽然在if里面调用了set方法,但是并没有调用get方法,所以程序并没有重新计算时间,然后你又调用了set方法,所以当你去取值得时候得到的就是新的值了
回复 使用道具 举报
周朋飞 发表于 2012-6-28 13:27
/*
                 * 原因:javadoc中对Calendar的字段操作有说明:字段操作 可以使用三种方法更改日历字段:set()、add ...

嗯 我会注意,但是 你仔细看的话我贴出来的东西都是经过调试自己通过之后我才写出来的,就像那个关于排序的,我知道我参考的是网站上的代码,,但是我也是在自己机器上写过之后,调试通了才贴出来的你可以试一下,我也认真的看了别人的代码,然后转换为自己的代码,这也算违规吗

点评

这不是说你不可以参考资料之类的,而是你就算你自己改了一部分,也没用,与其这样,你莫不如告诉其他人你是怎么找到解决办法的,对么?  发表于 2012-6-28 23:12
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马