当前位置: 代码迷 >> Java相关 >> java显示当前月日历程序遇到的有关问题
  详细解决方案

java显示当前月日历程序遇到的有关问题

热度:101   发布时间:2016-04-22 21:10:23.0
java显示当前月日历程序遇到的问题
import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarTest {
   public static void main(String[] args){
   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);
   int indent =0;
   while(weekday != firstDayOfWeek){
   indent++;
   d.add(Calendar.DAY_OF_MONTH, -1);
   
   System.out.println("Day" + d.get(Calendar.DAY_OF_MONTH));
   
   weekday = d.get(Calendar.DAY_OF_WEEK);
   }
   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);

   
//    for(int i = 0; i<weekdayNames.length; i++){
//    System.out.printf("%4s",weekdayNames[i]);
//    }

   System.out.println();
  
   for(int i = 1; i <= indent; 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(" ");
   
   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);
   }
}
红色区域的功能是显示
星期日  星期一  星期二  星期三 星期四  星期五 星期六
这一行,为什么不能用加注释的那个for循环来替代呢?这中间有什么奥妙呢?
希望高手指教
------解决方案--------------------
上面循环的那个GregorianCalendar 的add方法调用
------解决方案--------------------
引用:
add方法的调用应该是让d变成当月的第一天吧,可是后面的set方法将其设为第一天了呀

这个只是说你上面两个循环的区别

------解决方案--------------------
引用:
add方法的调用应该是让d变成当月的第一天吧,可是后面的set方法将其设为第一天了呀

至于你说的后面用set设置回来了
但是你上面有减的操作
d.add(Calendar.DAY_OF_MONTH, -1);
你上面设置为第一天然后减了 就退回到前一个月去了
然后又没有add回来
所以下面的
while(d.get(Calendar.MONTH) == month);
这个是false就不会循环了
  相关解决方案