输入一个时间段(开始时间,结束时间),一个参数来控制每行输出的月数,打印出日历

这是我开始实习时公司布置的一个小作业,一开始我也上网查了,网上有很多关于输出月份的文章,但是都是只输出一个月或者是竖向输出,我虽然是个菜鸟但也想分享一下自己的思路,望各位不吝赐教!

我的思路是将每个月看成7行,第一行:****年**月,第二行:日\t一\t二\t三\t四\t五\t六\t,第三行就是该月第一个星期,以此类推,因为一个月大多有5个星期,只有平年2月且该月第一天为1号时例外,只有4个星期,让后写一个方法StringBuilder getCalendar(int year,int month,int n),n表示行数,返回类型类型为StringBuilder,方便在后面增加字符串,然后将得到的StringBuilder放入list中,遍历list即可,代码如下(有很多没有考虑到的):

package classWork;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar; 
import java.util.Date;
import java.util.List;
import java.util.Scanner;
/**
 * 
 * @author 胡文亮
 *
 */
public class test { 
public static void main(String[] argus){
    Scanner scanner = new Scanner(System.in);
    List<String> list=
    new ArrayList<String>();
    //定义时间格式
    SimpleDateFormat sdf=
    new SimpleDateFormat("yyyyMMdd");
    Calendar start=Calendar.getInstance(); //获取开始Calendar对象
    Calendar end=Calendar.getInstance(); //获取开始Calendar对象
        System.out.println("请输入开始日期(格式:20140808):  ");
        String sTemp=scanner.nextLine();   //获取输入字符
        System.out.println("请输入结束日期(格式同上):");
        String eTemp=scanner.nextLine(); 
        System.out.println("您想每行输出几个月:");
        int f=scanner.nextInt();
        try {
        test t=new test();
        StringBuilder sb=new StringBuilder("");
Date sDate=sdf.parse(sTemp);
Date eDate=sdf.parse(eTemp);
start.setTime(sDate);
end.setTime(eDate);
//StringBuilder [] ss=new StringBuilder[f];
            int sYear = start.get(Calendar.YEAR); //获取开始的年份
            int sMonth = start.get(Calendar.MONTH); //获取开始的月份
            int sDay = start.get(Calendar.DATE);   //获取开始的日期
            int eYear = end.get(Calendar.YEAR); //获取的年份
            int eMonth = end.get(Calendar.MONTH); //获取开始的月份
            int eDay = end.get(Calendar.DATE);   //获取开始的日期
            int lg=(eYear-sYear)*12+(eMonth-sMonth)+1;//开始与结束相差的月份
            int n;
            int m=1;
           if(lg>=f){
            //整数的行
            for(int i=0;i<(lg/f);i++){
           for(n=0;n<=7;n++){
           
            for(int j=(m-1)*f;j<m*f;j++){
          //  list.add(t.getCalendar(sYear, sMonth, n).append(t.getCalendar(sYear, sMonth+1, n)).append(t.getCalendar(sYear, sMonth+2, n)).toString());
            //ss[j]=t.getCalendar(sYear, sMonth+j, n);
            sb.append(t.getCalendar(sYear+(sMonth+j)/12, (sMonth+j)-((sMonth+j)/12)*12, n));
            }
           list.add(sb.toString());
          
           sb.delete(0, sb.length());
           
           }
           for(String o:list){
           System.out.println(o);
           }
           list.clear();
           ++m;
            }
            //多余的行
            if(lg%f!=0){
            for(n=0;n<=7;n++){
            for(int j=(lg/f)*f;j<=(sMonth+lg-1);j++){
            sb.append(t.getCalendar(sYear+(sMonth+j)/12, (sMonth+j)-((sMonth+j)/12)*12, n));
            }
            list.add(sb.toString());
           sb.delete(0, sb.length());
            }
            for(String o:list){
             System.out.println(o);
             }
            }
           }else{
            System.out.println("月份满足不了!");
           }
} catch (ParseException e) {
System.out.println("在日期转换过程中出现错误!");
e.printStackTrace();
}finally{
scanner.close();                                                    //关闭输入流
}
}
//n表示星期,返回输入年月第n行的字符串
public StringBuilder getCalendar(int year,int month,int n){
Calendar firstcal = Calendar.getInstance();  
    Calendar lastcal = Calendar.getInstance();  
    firstcal.set(year, month, 1);// 所求月的第一天
    int dateofmonth = firstcal.getActualMaximum(Calendar.DATE);// 获取该月的天数  
    lastcal.set(year, month, dateofmonth);// 所求月的最后一天  
    int weekOfMonth = firstcal.getActualMaximum(Calendar.WEEK_OF_MONTH);// 获取该月的星期数  
    int firstday =  firstcal.get(Calendar.DAY_OF_WEEK);// 获取所求月第一天是星期几  
    int lastday =lastcal.get(Calendar.DAY_OF_WEEK); // 获取所求月最后一天是星期几  
    StringBuilder str=new StringBuilder();//用于存放表示一个星期的字符串
    int m=1;//m用来表示日期
    String[] week = new String[40];  
    if(weekOfMonth==4){//一个月只有4个星期,只有一种情况,平年2月
    switch(n){
    case 0:
    str.append("\t\t"+year+"年"+(month+1)+"月"+"\t\t\t");
    break;
    case 1:
    str.append("日\t一\t二\t三\t四\t五\t六\t");
    break;
    case 2:
    str.append("1\t2\t3\t4\t5\t6\t7\t");
    break;
    case 3:
    str.append("8\t9\t10\t11\t12\t13\t14\t");
    break;
    case 4:
    str.append("15\t16\t17\t18\t19\t20\t21\t");
    break;
    case 5:
    str.append("22\t23\t24\t25\t26\t27\t28\t");
    break;
    case 6:
    str.append(" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t");
    break;
    case 7:
    str.append(" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t");
    break;
    default:
    str.append("您输入的星期有误");
    break;
    }
    }else{
    switch(n){
    case 0:
    str.append("\t\t"+year+"年"+(month+1)+"月"+"\t\t\t");
    break;
    case 1:
    str.append("日\t一\t二\t三\t四\t五\t六\t");
    break;
    case 2:
    //第一个星期
        if(firstday==1){
        str.append(m+"\t"+(m+1)+"\t"+(m+2)+"\t"+(m+3)+"\t"+(m+4)+"\t"+(m+5)+"\t"+(m+6)+"\t");
        }else{
        for (int j = 0; j < firstday-1; j++)  
             {  
                  week[j]= " "+"\t";  
                  str.append(week[j]);
             }  
             for (int i = firstday-1; i < 7; i++)  
             {  
                 week[i]=m+"\t";  
                 m++;
                 str.append(week[i]); 
             }  
        }
        break;
    case 3://第二星期
    m=9-firstday;
    str.append(m+"\t"+(m+1)+"\t"+(m+2)+"\t"+(m+3)+"\t"+(m+4)+"\t"+(m+5)+"\t"+(m+6)+"\t");
    break;
    case 4://第三星期
    m=16-firstday;
    str.append(m+"\t"+(m+1)+"\t"+(m+2)+"\t"+(m+3)+"\t"+(m+4)+"\t"+(m+5)+"\t"+(m+6)+"\t");
    break;
    case 5://第四星期
    m=23-firstday;
    str.append(m+"\t"+(m+1)+"\t"+(m+2)+"\t"+(m+3)+"\t"+(m+4)+"\t"+(m+5)+"\t"+(m+6)+"\t");
    break;
    case 6://第五星期
    if(dateofmonth<=(36-firstday)){
    for(m=(30-firstday);m<=dateofmonth;m++){
    week[m]=m+"\t";
    str.append(week[m]);
    }
    for(m=(dateofmonth+1);m<=(36-firstday);m++){
    week[m]=" "+"\t";
    str.append(week[m]);
    }
    }else{
    m=30-firstday;
    str.append(m+"\t"+(m+1)+"\t"+(m+2)+"\t"+(m+3)+"\t"+(m+4)+"\t"+(m+5)+"\t"+(m+6)+"\t");
    }
    break;
    case 7:
    if(dateofmonth>(36-firstday)){
    for(m=(37-firstday);m<=dateofmonth;m++){
        week[m]=m+"\t";
        str.append(week[m]);
        }
        for(m=(dateofmonth+1);m<=(43-firstday);m++){
        week[m]=" "+"\t";
        str.append(week[m]);
        }
    }else{
    str.append(" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t"+" "+"\t");
    }
    break;
    default:
    str.append("您输入星期有误");
    }
    }
    return str;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值