import java.text.DateFormatSymbols;
import java.util.*;
/**
* @version 1.4 2007-04-07
* @author Cay Horstmann
*/
public class CalendarTest
{
public static void main(String[] args)
{
// construct d as current date
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);//返回此时是当月的某天
int month = d.get(Calendar.MONTH);//返回当月月份
// set d to start date of the month
d.set(Calendar.DAY_OF_MONTH, 1);//指向当月的第一天
int weekday = d.get(Calendar.DAY_OF_WEEK);//获得这天是周几
// get first day of week (Sunday in the U.S.)
int firstDayOfWeek = d.getFirstDayOfWeek();
//获得当前地区星期的起始日,一般是周日,在欧洲是周一
// determine the required indentation for the first line
int indent = 0;//第一行需要缩进的距离
while (weekday != firstDayOfWeek)
{
indent++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}//如果该月第一天不是一周的第一天,则将日历对象的日减一,知道一个星期的第一天为止。
// print weekday names
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();//返回用户语种所命名的表示星期几的缩写字符串
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 <= indent; i++)
System.out.print(" ");//打印缩进距离
d.set(Calendar.DAY_OF_MONTH, 1);//将日历再次设为一个月的起始日
do
{
// print day
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
// mark current day with *
if (day == today) System.out.print("*");
else System.out.print(" ");
// advance d to the next day
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
// start a new line at the start of the week
if (weekday == firstDayOfWeek) System.out.println();
}
while (d.get(Calendar.MONTH) == month);
// the loop exits when d is day 1 of the next month
// print final end of line if necessary
if (weekday != firstDayOfWeek) System.out.println();
}
}
输出结果类似:
星期日 星期一 星期二 星期三 星期四 星期五 星期六
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19* 20 21 22 23 24
25 26 27 28 29 30 31