显示当前月的日历(摘自java核心技术.卷I)

来源:互联网 发布:ftp上传工具 for mac 编辑:程序博客网 时间:2024/06/09 18:51
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 

原创粉丝点击