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