黑马程序员技术交流社区

标题: 做练习题的时候遇到的问题(关于Date那部分),求解 [打印本页]

作者: 龚首道    时间: 2013-7-2 18:40
标题: 做练习题的时候遇到的问题(关于Date那部分),求解
本帖最后由 龚首道 于 2013-7-3 11:14 编辑

各位大侠大家好,我是个菜鸟,首次在这里发帖,准备报云5,不知还来得及不。
今天在做练习题的时候遇到个小问题,想请教一下,代码些的烂,求指点。{:soso_e112:}[qq]772703483[/qq]

问题:获取任意年的二月有多少天。
小弟的代码和问题截图如下:
  1. /*1、获取任意年的二月有多少天。
  2.         分析:要获取该数值,只需拿那一年的3月1日减去1天即可。
  3.         编程:首先用set方法设置指定的年份。
  4.                   再用add方法给指定年份的3月1日加上-1,这样就得到了二月的最后一天,也就是二月总共的天数
  5.                   然后输出这个值。
  6.                   其中得编写自定义的日历输出格式,只显示有用信息。

  7. */

  8. import java.util.*;
  9. import java.text.*;
  10. class CalendarTest
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 int y = 2014;
  15.                 Calendar c = Calendar.getInstance();//getInstance:使用默认时区和语言环境获得一个日历
  16.                 c.set(y,3,1);//自己将日期定义为y年
  17.                 c.add(Calendar.DAY_OF_MONTH,-1);//这里给天数减1了
  18.                
  19.                 //打印年
  20.                 sop(getYear(c)+"年");

  21.                 //打印月
  22.                 sop(getMonth(c));

  23.                 //打印日
  24.                 sop(getDay(c));

  25.                 //打印星期
  26.                 sop(getWeek(c));
  27.         }

  28.         //获取日
  29.         public static int getDay(Calendar c)
  30.         {
  31.                 return c.get(Calendar.DAY_OF_MONTH);
  32.         }
  33.         
  34.         //获取星期
  35.         public static String getWeek(Calendar c)
  36.         {
  37.                 String[] Week = {"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
  38.                 int indexWeek = c.get(Calendar.DAY_OF_WEEK);
  39.                 return Week[indexWeek];
  40.         }

  41.         //获取月份
  42.         public static String getMonth(Calendar c)
  43.         {
  44.                 //查表法
  45.                 String[] Month = {"","一月","二月","三月","四月","五月","六月", "七月","八月","九月","十月","十一月","十二月"};//角标从零开始,所以不能把月份写在0角标为上。
  46.                 //获取的月份或星期数作为角标
  47.                 int indexMonth = c.get(Calendar.MONTH);
  48.                 return Month[indexMonth];               
  49.         }

  50.         //获取年
  51.         public static int getYear(Calendar c)
  52.         {
  53.                 return c.get(Calendar.YEAR);
  54.         }

  55.         public static void sop(Object obj)
  56.         {
  57.                 System.out.println(obj);
  58.         }
  59. }
复制代码
现在,问题就出来了!
如图:


大家帮我看看···为什么?


我估计可能是这里出了问题:
c.set(y,3,1);//自己将日期定义为y年
c.add(Calendar.DAY_OF_MONTH,-1);//这里给月份减1了

打印出来却是二月31日!!!
新问题又来了
但是,

①把这个数组里0角标为上的空去掉,
  1. String[] Month = {"","一月","二月","三月","四月","五月","六月", "七月","八月","九月","十月","十一月","十二月"};
复制代码
然后 c.set(y,3,1);里的3该为2,即可正确显示。但是必须是①②同时满足时,才会输出正确。

WHY?
请赐教啊!




作者: 宋智超    时间: 2013-7-2 20:26
  1. /*1、获取任意年的二月有多少天。
  2. 分析:要获取该数值,只需拿那一年的3月1日减去1天即可。
  3. 编程:首先用set方法设置指定的年份。
  4. 再用add方法给指定年份的3月1日加上-1,这样就得到了二月的最后一天,也就是二月总共的天数
  5. 然后输出这个值。
  6. 其中得编写自定义的日历输出格式,只显示有用信息。

  7. */

  8. import java.util.*;
  9. import java.text.*;
  10. class CalendarTest
  11. {
  12. public static void main(String[] args)
  13. {
  14. int y = 2014;
  15. Calendar c = Calendar.getInstance();//getInstance:使用默认时区和语言环境获得一个日历
  16. c.set(y,2,1);//自己将日期定义为y年
  17. c.add(Calendar.DAY_OF_MONTH,-1);//这里给月份减1了


  18. //打印年
  19. sop(getYear(c)+"年");

  20. //打印月
  21. sop(getMonth(c));

  22. //打印日
  23. sop(getDay(c));

  24. //打印星期
  25. sop(getWeek(c));
  26. }

  27. //获取日
  28. public static int getDay(Calendar c)
  29. {
  30. return c.get(Calendar.DAY_OF_MONTH);
  31. }

  32. //获取星期
  33. public static String getWeek(Calendar c)
  34. {
  35. String[] Week = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
  36. int indexWeek = c.get(Calendar.DAY_OF_WEEK);
  37. return Week[indexWeek];
  38. }

  39. //获取月份
  40. public static String getMonth(Calendar c)
  41. {
  42. //查表法
  43. String[] Month = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};//角标从零开始,所以不能把月份写在0角标为上。
  44. //获取的月份或星期数作为角标
  45. int indexMonth = c.get(Calendar.MONTH);
  46. return Month[indexMonth];
  47. }

  48. //获取年
  49. public static int getYear(Calendar c)
  50. {
  51. return c.get(Calendar.YEAR);
  52. }

  53. public static void sop(Object obj)
  54. {
  55. System.out.println(obj);
  56. }
  57. }
复制代码
代码修改如上图,运行结果如下图,
说明:星期日是在星期一之前的,其次月份查表前面无须加“ ”,只需获取时间时设置为:c.set(y,2,1);
我把年改成2013试了一下,查了万年历,结果是正确的。


作者: 000lazy    时间: 2013-7-2 22:24
本帖最后由 000lazy 于 2013-7-2 23:07 编辑

c.add(Calendar.DAY_OF_MONTH,-1);//这里给月份减1了     这里是给这个月份天数减一

月份由从 0 至 11 的整数表示;0 是一月、1 是二月等等;因此 11 是十二月,所以求2月的天数应该是2
c.set(y,2,1);
c.add(Calendar.DAY_OF_MONTH,-1);//减一天,2变为1 ,而1表示2月份
c.get(Calendar.DAY_OF_MONTH)=28,

还有0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday  
我想问一问c.get(Calendar.DAY_OF_WEEK)返回值和什么相关,为什么不是整数(0-6),和星期对应。

作者: 宋智超    时间: 2013-7-2 23:46
不客气,希望能帮到你,我也是新手,共同学习进步!
作者: 龚首道    时间: 2013-7-2 23:58
000lazy 发表于 2013-7-2 22:24
c.add(Calendar.DAY_OF_MONTH,-1);//这里给月份减1了     这里是给这个月份天数减一
编程思路:首先用set方 ...

从你回答了这个问题开始,我就开始调试,还是没有找出答案。。。好奇怪,bug在哪里?不会了:'(
作者: 龚首道    时间: 2013-7-3 00:00
宋智超 发表于 2013-7-2 20:26
代码修改如上图,运行结果如下图,
说明:星期日是在星期一之前的,其次月份查表前面无须加“ ”,只需获取 ...

问题虽然解决了,但是又有新的问题,见楼下。。。
作者: 龚首道    时间: 2013-7-3 00:28
本帖最后由 龚首道 于 2013-7-3 00:37 编辑
000lazy 发表于 2013-7-2 22:24
c.add(Calendar.DAY_OF_MONTH,-1);//这里给月份减1了     这里是给这个月份天数减一

月份由从 0 至 11 的 ...

这句话看不太懂:“我想问一问c.get(Calendar.DAY_OF_WEEK)返回值和什么相关,为什么不是整数(0-6),和星期对应。”
拿我的这点代码运行下就能试出来
  1. sop(c.get(Calendar.DAY_OF_WEEK));
  2.                 sop(getWeek(c));//输出5
  3. String[] Week = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};//5角标为上是“星期四”
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2