package 项目2;
import java.text.DateFormatSymbols;
import java.util.*;
public class CalendarTest {
public static void main(String args[])
{ //如果想看到不同地区程序的输出,应该在main方法的第一行添加下列代码
//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设置为这个月的第一天,并得到这一天为星期几
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(); //firstDayOfWeek 代表的是当地一个星期的第一天是星期几,这里我们是星期日
//determine the required indentation for the first line
int indent=0; //indent是为了计数,日历首行应该缩进几位
while(weekday!=firstDayOfWeek)
{
indent++;
d.add(Calendar.DAY_OF_MONTH,-1); //将 d 设为上一天,那么对应的weekday的星期也就减一
weekday=d.get(Calendar.DAY_OF_WEEK);
}
//print weekday names //开始输出表示星期几名称的头
String[] weekdayNames=new DateFormatSymbols().getShortWeekdays();
do //因为 do 。。。 while 是先做一次循环,循环开始是weekday与firstDayOfWeek是相同的
{
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=0;i<=indent;i++) //根据indent,打印首行缩进的空格
System.out.print(" ");
//开始输出日历内容
d.set(Calendar.DAY_OF_MONTH,1); //在循环中用d记录一个月中的每一天,首先先设为月份的第一天
do
{
//print day
int day=d.get(Calendar.DAY_OF_MONTH);//定义一个int变量day进行每一天的输出
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);//将d设为下一天
weekday=d.get(Calendar.DAY_OF_WEEK);//weekday记录这一天的星期数
//start a new line at the start of the week
if(weekday==firstDayOfWeek) //如果已经输出七天,则换行输出下一星期
System.out.println();
}while(d.get(Calendar.MONTH)==month); //一旦d进入下一月,程序结束
//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();
}
}
import java.text.DateFormatSymbols;
import java.util.*;
public class CalendarTest {
public static void main(String args[])
{ //如果想看到不同地区程序的输出,应该在main方法的第一行添加下列代码
//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设置为这个月的第一天,并得到这一天为星期几
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(); //firstDayOfWeek 代表的是当地一个星期的第一天是星期几,这里我们是星期日
//determine the required indentation for the first line
int indent=0; //indent是为了计数,日历首行应该缩进几位
while(weekday!=firstDayOfWeek)
{
indent++;
d.add(Calendar.DAY_OF_MONTH,-1); //将 d 设为上一天,那么对应的weekday的星期也就减一
weekday=d.get(Calendar.DAY_OF_WEEK);
}
//print weekday names //开始输出表示星期几名称的头
String[] weekdayNames=new DateFormatSymbols().getShortWeekdays();
do //因为 do 。。。 while 是先做一次循环,循环开始是weekday与firstDayOfWeek是相同的
{
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=0;i<=indent;i++) //根据indent,打印首行缩进的空格
System.out.print(" ");
//开始输出日历内容
d.set(Calendar.DAY_OF_MONTH,1); //在循环中用d记录一个月中的每一天,首先先设为月份的第一天
do
{
//print day
int day=d.get(Calendar.DAY_OF_MONTH);//定义一个int变量day进行每一天的输出
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);//将d设为下一天
weekday=d.get(Calendar.DAY_OF_WEEK);//weekday记录这一天的星期数
//start a new line at the start of the week
if(weekday==firstDayOfWeek) //如果已经输出七天,则换行输出下一星期
System.out.println();
}while(d.get(Calendar.MONTH)==month); //一旦d进入下一月,程序结束
//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();
}
}