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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 恨天~无过… 于 2014-5-5 00:02 编辑
  1. package Date.com.test;

  2. import java.text.DateFormat;
  3. import java.text.ParseException;
  4. import java.util.Date;
  5. import java.util.Scanner;

  6. public class Kalendar_day_Test {

  7.         /**
  8.          * @param args
  9.          * @throws ParseException
  10.          *             创建一个现在输入的年份及月份得出此年此月日历
  11.          */
  12.         public static void main(String[] args) throws ParseException {
  13.                 // TODO Auto-generated method stub
  14.                 Scanner in = new Scanner(System.in);
  15.                 System.out.println("请输入现在的年份");
  16.                 int year = in.nextInt();
  17.                 System.out.println("请输入现在的月份");
  18.                 int month = in.nextInt();
  19.                 String str = year + "-" + month + "-1";
  20.                 print(str, year, month);
  21.         }

  22.         public static void print(String str, int year, int month)
  23.                         throws ParseException {
  24.                 String str2 = "1900-1-1"; // 设置参照的时间,因为此时间为星期一
  25.                 int day = toTimeDay(str, str2);
  26.                 System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
  27.                 int x = day % 7; // 为了保证前面的空格,模7的余数就是空格数;

  28.                 for (int i = 0; i <= x; i++) {
  29.                         System.out.print("\t");
  30.                 }

  31.                 int mon_day = 0;
  32.                 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
  33.                                 || month == 10 || month == 12) { // 根据月份来判断这个月有多少天
  34.                         mon_day = 31;
  35.                 } else if (month == 2) {
  36.                         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 判断year此年是平年还是瑞年
  37.                                 mon_day = 29;
  38.                         } else {
  39.                                 mon_day = 28;
  40.                         }
  41.                 } else {
  42.                         mon_day = 30;
  43.                 }
  44.                 int t = 1;
  45.                 for (int i = 1; i <= mon_day; i++) {
  46.                         int sum = (day + t) % 7;
  47.                         if (sum == 6) {
  48.                                 System.out.println(i);
  49.                         } else {
  50.                                 System.out.print(i + "\t");
  51.                         }
  52.                         t++;
  53.                 }
  54.         }
  55.         private static int toTimeDay(String str1_date, String str2_date)
  56.                         throws ParseException {
  57.                 DateFormat dateFormat = DateFormat.getDateInstance(); // 创建DateFormat对象;
  58.                 Date date_1 = dateFormat.parse(str1_date); // 根据DateFormat对象的parse方法获取Date对象
  59.                 Date date_2 = dateFormat.parse(str2_date);
  60.                 long time_1 = date_1.getTime(); // 根据Date对象的方法获取其对象的毫秒值
  61.                 long time_2 = date_2.getTime();
  62.                 long time = Math.abs(time_1 - time_2); // 用相减的方法获取两时间的时间差,为了随机的时间问题,用Math类的abs绝对值方法
  63.                 int day = toDay(time);
  64.                 return day;
  65.         }

  66.         private static int toDay(long time) { // 用于把毫秒值转成天数的方法
  67.                 // TODO Auto-generated method stub
  68.                 int day = (int) (time / 1000 / 60 / 60 / 24);
  69.                 return day;
  70.         }

  71. }
复制代码


但发现当输入6月份时不行,其它的月份都是可行的,这是哪里分析错误,求赐教!!

评分

参与人数 1技术分 +1 收起 理由
天涯追梦 + 1

查看全部评分

2 个回复

倒序浏览
     int x = day % 7; // 为了保证前面的空格,模7的余数就是空格数;

                for (int i = 0; i <= x; i++) {
                        System.out.print("\t");
                }
               
                if (x == 6){
                        System.out.println();
                }

打印制表符的时候判断一下,超出就换行
回复 使用道具 举报
这个问题其实不是2014年的6月不行,而是只要这个月的1号是星期天就不行。
比如2010年的8月,也会出现这个问题。
原因是: int x = day % 7 这句来判断打印制表符时,如果这个月的1号恰好是周日,那么x=6
这样以来:打印的制表符就是7个。自然就会超出格式范围了。
那么可以加上一个判断来消除这个问题:
  1. if(x==6){//如果x为6,则不打印制表符,这里不打印就是什么也不做就好了
  2.                        
  3.                 }else{
  4.                         for (int i = 0; i <= x; i++) {
  5.                                 System.out.print("\t");
  6.                         }
  7.                 }
复制代码


评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马