java中GregorianCalendar类的使用

实现了输出本月的日历,结果如:


摘自《java核心技术 卷1》中的代码,觉得源码还是有点啰嗦,也可能是我的菜鸟级别欣赏不了大师的水平,后面自己要再试着写一遍

package impl.cal;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.DateFormatSymbols;

public class CalendarTest {
	public static void main(String arge[]){
		GregorianCalendar d=new GregorianCalendar();
		int today=d.get(Calendar.DAY_OF_MONTH);//得到今天是这个月的第几天
		int month=d.get(Calendar.MONTH);//得到当前是第几个月
		d.set(Calendar.DAY_OF_MONTH, 1);//将日期改为本月的第一天
		int weekday=d.get(Calendar.DAY_OF_WEEK);//得到本月的第一天为星期几
		int firstDayOfWeek=d.getFirstDayOfWeek();//得到当前时区,一个星期的第一天设置为周几?(有的是周日,有的是周一)
		//System.out.println(firstDayOfWeek); //输出1 就是星期日啦
		int intent=0;
		while(weekday!=firstDayOfWeek){
			intent++;
			d.add(Calendar.DAY_OF_MONTH, -1);//日期后退一天,进入上个月
			weekday=d.get(Calendar.DAY_OF_WEEK);//得到后退一天是星期几,直到weekday取值为星期日,d设置为一个星期的第一天,但不是在本月
		}
		String[] weekdayNames=new DateFormatSymbols().getShortWeekdays();
		/*for(String a:weekdayNames){
			System.out.print(a+"\t");
		}*/
		do{
			System.out.printf("%4s",weekdayNames[weekday]);
			d.add(Calendar.DAY_OF_MONTH, 1);//日期向前一天
			weekday=d.get(Calendar.DAY_OF_WEEK);
		}while(weekday!=firstDayOfWeek);  //其实就是输出了列名
		System.out.println();
		//输出要缩进的格数
		for(int i=1;i<=intent;i++){
			System.out.print("      ");
		}
		d.set(Calendar.DAY_OF_MONTH, 1); 
		do{
			int day=d.get(Calendar.DAY_OF_MONTH);
			System.out.printf("%5d",day);
			//检测如果是今天,就多输出一个字符
			if(day==today) System.out.print("$");
			else System.out.print(" ");
			
			d.add(Calendar.DAY_OF_MONTH, 1);
			weekday=d.get(Calendar.DAY_OF_WEEK);
			if(weekday==firstDayOfWeek) System.out.println();
		}while(d.get(Calendar.MONTH)==month);
		
		if(weekday!=firstDayOfWeek) System.out.println();//如果本月的最后一天是周一到周六内的,就输出一个换行,循环里没输出
		
	}

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值