写出如下代码的输出结果

tteesstt 2008-06-23 09:59:06
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());
}
}
...全文
146 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagezk 2008-06-24
  • 打赏
  • 举报
回复
更正:上面倒数第2段中有句“不一致的命名以及不一致的雨衣等”应为“不一致的命名以及不一致的语义等”,英文原文为“inconsistent naming, and inconsistent semantics”。
sagezk 2008-06-24
  • 打赏
  • 举报
回复
日期游戏
下面的程序演练了 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解惑》。
Sou2012 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wang_qing_2008 的回复:]
运行结果为: 2000 1
[/Quote]
purple.taro 2008-06-23
  • 打赏
  • 举报
回复
当最后不用getDay()而使用getMonth()时,就会发现,
返回:2000 0

如果要是设置将其中的cal.set(1999,12,31)替换成cal.set(1999,13,31)时,用getMonth()将返回是2000 2
这说明Calendar判断的当月份大于11时,就会自己减12,年自动加1,将日期设置为下一年。
youhere1 2008-06-23
  • 打赏
  • 举报
回复
看来上楼主恶当的人已经越来越少了,进步啊
不过楼主怎么有这么多分啊?
cursor_wang 2008-06-23
  • 打赏
  • 举报
回复
2008 1

最主要是设置月份是从0开始的,你设置了12,所以它就变成了2000年的1月31日了,所以是星期一.最后打印2008 1.
wang_qing_2008 2008-06-23
  • 打赏
  • 举报
回复
运行结果为: 2000 1

lzx6169936 2008-06-23
  • 打赏
  • 举报
回复
2000 1
会自动向上进位地 不错
jdlsfl 2008-06-23
  • 打赏
  • 举报
回复
返回日期
Date.getDate()
dadi5566 2008-06-23
  • 打赏
  • 举报
回复
想起来了月份是从0到11,我们在现实的时候要加上1才是当前的月份,所以在设置的日期时,但前月份减去已才可以

你设置的12 实质上就是指2000年的1月,所以打印2000
jdlsfl 2008-06-23
  • 打赏
  • 举报
回复
2000 1

一个陷阱,cal.set里的month是从0开始的
又一个陷阱,Date.getDay()表示日期所在的一周中的某一天,0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday
老紫竹 2008-06-23
  • 打赏
  • 举报
回复
恩,12月的编号是11才对。









 
 
dadi5566 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 tteesstt 的帖子:]
Java codeimport 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());
}
}
[/Quote]

运行结果为:

2000 1
TRMeister 2008-06-23
  • 打赏
  • 举报
回复
2000 1
java_lover_ 2008-06-23
  • 打赏
  • 举报
回复
2000 1

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧