import java.util.*;
public class DatingGame {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.set(1999, 12, 31); // Year, Month, Day
        System.out.print(cal.get(Calendar.YEAR) + " ");
        Date d = cal.getTime();
        System.out.println(d.getDay());
    }
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【tteesstt】截止到2008-06-23 21:59:01的历史汇总数据(不包括此帖):
    发帖数:62                 发帖分:2800               
    结贴数:61                 结贴分:2700               
    未结数:1                  未结分:100                
    结贴率:98.39 %            结分率:96.43 %            
    值得尊敬
      

  2.   

    2000 1一个陷阱,cal.set里的month是从0开始的
    又一个陷阱,Date.getDay()表示日期所在的一周中的某一天,0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday
      

  3.   

    当最后不用getDay()而使用getMonth()时,就会发现,
    返回:2000 0如果要是设置将其中的cal.set(1999,12,31)替换成cal.set(1999,13,31)时,用getMonth()将返回是2000 2 
    这说明Calendar判断的当月份大于11时,就会自己减12,年自动加1,将日期设置为下一年。
      

  4.   

    日期游戏
    下面的程序演练了 Date 和 Calendar 类的某些基本特性,它会打印出什么呢?
    import java.util.*;
    public class DatingGame {
        public static void main(String[ ] args) {
            Calendar cal = Calendar.getInstance();
            cal.set(1999, 12, 31); // Year, Month, Day
            System.out.print(cal.get(Calendar.YEAR) + " ");
            Date d = cal.getTime();
            System.out.println(d.getDay());
        }
    }
    该程序创建了一个 Calendar 实例,它应该表示的是 1999 年的除夕夜,然后该程序打印年份和日。看起来该程序应该打印 1999 31,但是它没有;它打印的是2000 1。难道这是致命的Y2K(千年虫)问题吗?不,事情比我们想象的要糟糕得多:这是致命的 Date/Calendar 问题。在 Java 平台首次发布时,它唯一支持日历计算类的就是 Date 类。这个类在能力方面是受限的,特别是当需要支持国际化时,它就暴露出了一个基本的设计缺陷:Date 实例是易变的。在 1.1 版中,Calendar 类被添加到了Java 平台中,以矫正 Date 的缺点,由此大部分的 Date 方法就都被弃用了。遗憾的是,这么做只能使情况更糟。我们的程序说明 Date 和 Calendar API 有许多问题。
    该程序的第一个 bug 就位于方法调用 cal.set(1999,12,31) 中。当月份以数字来表示时,习惯上我们将第一个月被赋值为1。遗憾的是,Date 将一月表示为0,而 Calendar 延续了这个错误。因此,这个方法调用将日历设置到了 1999 年第 13 个月的第 31 天。但是标准的(西历)日历只有 12 个月,该方法调用肯定应该抛出一个 IllegalArgumentException 异常,对吗?它是应该这么做,但是它并没有这么做。Calendar 类直接将其替换为下一年,在本例中即 2000 年的第一个月。这也就解释了我们的程序为什么打印出的第一个数字是 2000。
    有两种方法可以订正这个问题。你可以将 cal.set 调用的第二个参数由 12 改为 11,但是这么做容易引起混淆,因为数字 11 会让读者误以为是 11 月。更好的方式是使用 Calendar 专为此目的而定义的常量,即 Calendar.DECEMBER。
    该程序打印出的第二个数字又是怎么回事呢?cal.set 调用很明显是要把日历设置到这个月的第 31 天,Date 实例 d 表示的是与 Calendar 相同的时间点,因
    此它的 getDay 方法应该返回 31,但是程序打印的却是1,这是怎么搞得呢?
    为了找出原因,你必须先阅读一下文档,它叙述道 Date.getDay 返回的是 Date 实例所表示的星期日期,而不是月份日期。这个返回值是基于 0 的,从星期天开
    始计算。因此程序所打印的 1 表示 2000 年 1 月31 日是星期一。请注意,相应的 Calendar 方法 get(Calendar.DAY_OF_WEEK) 不知为什么返回的是基于 1 的星期日期值,而不是像 Date 的对应方法那样返回基于 0 的星期日期值。
    有两种方法可以订正这个问题。你可以调用 Date.date 这一名字极易让人混淆的方法,它返回的是月份日期。然而,与大多数 Date 方法一样,它已经被弃用了,因此你最好是将 Date 彻底抛弃,直接调用 Calendar 的 get(Calendar.DAY_OF_MONTH) 方法。用这两种方法,该程序都可以打印出我们想要的 1999 31:
    public class DatingGame {
        public static void main(String[] args) {
            Calendar cal = Calendar.getInstance();
            cal.set(1999, Calendar.DECEMBER, 31);
            System.out.print(cal.get(Calendar.YEAR) + " ");
            System.out.println(cal.get(Calendar.DAY_OF_MONTH));
        }
    }
    本谜题只是掀开了 Calendar 和 Date 缺陷的冰山一角。这些API 简直就是雷区。Calendar 其他的严重问题包括弱类型(几乎每样事物都是一个int)、过于复杂的状态空间、拙劣的结构、不一致的命名以及不一致的雨衣等。在使用 Calendar 和 Date 的时候一定要当心,千万要记着查阅 API 文档。
    对 API 设计者来说,其教训是:如果你不能在第一次设计时就使它正确,那么至少应该在第二次设计时应该使它正确,绝对不能留到第三次设计时去处理。如果
    你对某个 API 的首次尝试出现了严重问题,那么你的客户可能会原谅你,并且会再给你一次机会。如果你第二次尝试又有问题,你可能会永远坚持这些错误了。
    摘自《Java解惑》。
      

  5.   

    更正:上面倒数第2段中有句“不一致的命名以及不一致的雨衣等”应为“不一致的命名以及不一致的语义等”,英文原文为“inconsistent naming, and inconsistent semantics”。