本系列来源于java经典教科书《java核心技术卷一:基础知识》,重新阅读一遍,温故知新,在自己巩固一下基础知识的同时,也记录这样一份程序,方便大家参考。
本篇主要介绍了java的日期类Calendar类的一个子类实现GregorianCalendar。主要通过实现一个简单的日历程序,介绍了一些GregorianCalendar的常用方法。同时一些入门的朋友也可以使用这个小程序练习一下三种不同的循环语法。
题目要求,如图所示:
在控制台中输出如图所示的日历,当前日期标“*”,并根据实际的情况缩进首行。
可以先想一下实现题目的基本思路,或者直接动手写一下再来看思路分析
首先,由于我们一直都需要对日期做操作,因此先实例化一个GregorianCalendar
GregorianCalendar d=new GregorianCalendar();
接下来我们需要输出一组星期标志,这里我使用了DateFormatSymbols 类的getShortWeekdays方法,这个方法返回了一个以简短形式星期字符串组成的数组,使用Calendar.SUNDAY、Calendar.MONDAY 等常量指出该数组。(注:DateFormatSymbols 是一个公共类,用于封装可本地化的日期-时间格式化数据,如月名、星期几的名称和时区数据。DateFormat 和 SimpleDateFormat 都使用 DateFormatSymbols 封装信息。)
String[] weekdayNames=new DateFormatSymbols().getShortWeekdays();
为了遍历数组weekdayNames,我们需要定义一个变量,用来取出数组中的星期信息,然后使用循环遍历,输出数组信息。这里使用do-while循环,表示先执行一次,再判断循环条件。
//这时weekday与firstDayOfWeek都为1
int weekday=d.get(Calendar.DAY_OF_WEEK);
int firstDayOfWeek=d.getFirstDayOfWeek();
do {
//输出星期
System.out.printf("%4s",weekdayNames[weekday]);//日历的日期+1
d.add(Calendar.DAY_OF_MONTH, 1);//星期+1
weekday=d.get(Calendar.DAY_OF_WEEK);//将weekday赋值为+1后的星期
} while (weekday !=firstDayOfWeek);//当weekday重新为1时结束循环
接下来处理缩进,取出当前月第一天的是星期几,与每周的第一天作比较,每差一天,便输出一个空格。这里使用while循环,用于事先不知道具体的循环次数
int ident=0;//控制空格数量的变量
while (weekday!=firstDayOfWeek) {
ident++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday=d.get(Calendar.DAY_OF_WEEK);
}
输出空格,使用for循环输出空格,for循环用于确定次数的循环:
for(int i=1;i<=ident;i++){
System.out.print(" ");
}
最后是输出日期,循环输出本月的每一天。判断条件如下:
判断当前日期:当循环到当日日期时,输出“*”。
判断换行:利用当前日期和每周第一天的比较来确认是否换行。
判断循环结束:因为不知道本月是28,30还是31天,所以使用do-while循环,当日历的月份不是当月月份时,结束循环。
int today=d.get(Calendar.DAY_OF_MONTH);
int month=d.get(Calendar.MONTH);
do {
int day=d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d",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);
一下是整个程序,为了书写方便进行了一些整合。程序中的输出注释放开后可以看到GregorianCalendar具体方法的值。
package calender;
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalenderTest {
public static void main(String[] args) {
GregorianCalendar d=new GregorianCalendar(); //定义日历
int today=d.get(Calendar.DAY_OF_MONTH); //当前日期
int month=d.get(Calendar.MONTH); //当前月份
String[] weekdayNames=new DateFormatSymbols().getShortWeekdays(); //星期标志
//System.out.println("today:"+today+"month"+month);
d.set(Calendar.DAY_OF_MONTH, 1); //初始化日历
int weekday=d.get(Calendar.DAY_OF_WEEK); //获得日历的星期
//System.out.println("weekday:"+d.get(Calendar.DAY_OF_MONTH));
int firstDayOfWeek=d.getFirstDayOfWeek(); //获得每周的第一天
//System.out.println("firstDayOfWeek:"+firstDayOfWeek);
int ident=0; //定义空格数量
while (weekday!=firstDayOfWeek) {
//获取应输出的空格数量
ident++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday=d.get(Calendar.DAY_OF_WEEK);
}
do {
//输出星期
System.out.printf("%4s",weekdayNames[weekday]);
//日历的日期+1
d.add(Calendar.DAY_OF_MONTH, 1);
//将weekday赋值为2
weekday=d.get(Calendar.DAY_OF_WEEK);
} while (weekday !=firstDayOfWeek);
System.out.println("");
for(int i=1;i<=ident;i++){
//输出空格
System.out.print(" ");
}
d.set(Calendar.DAY_OF_MONTH, 1);
do {
//输出日期
int day=d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d",day);
//判断当日
if(day==today){
System.out.print("*");
}else {
System.out.print(" ");
}
//日期+1
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);
}
}