今天突然遇到一个简单问题却被难住了,怎样获得某一年某一月的总天数?
比如如何算出2005-12月共有31天。自己想了一个算法但是觉得太烦,所以向各位征集简单的算法,请大家多多参与。

解决方案 »

  1.   

    把“月”分类  
      一,三,五,七,八,十,十二 是31天。
      四,六,九,十一是30天。
      二月最特殊,要根据年份来判断,闰年29天,不是闰年28天。
      闰年的算法:  闰年年份可以被4整除而不能被100整除,或者能被400整除。
      (year%4==0&&year%100!=0)||(year%400==0)
      

  2.   

    有没有办法从calendar的方法和参数直接计算的?谢谢!
      

  3.   

    给你个校验例子,自己看看吧  /**
       * 校验给定的年月日是否为一个有效日期
       * @param year String 给定的年份
       * @param month String 给定的月份
       * @param day String 给定的日期
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isDate(String year, String month, String day) {    int intYear = Integer.parseInt(year);
        int intMonth = Integer.parseInt(month);
        int intDay = Integer.parseInt(day);    if (!isYear(year).booleanValue()) {
          return new Boolean(false);
        }    if (!isMonth(month).booleanValue()) {
          return new Boolean(false);
        }    if (!isDay(day).booleanValue()) {
          return new Boolean(false);
        }    if (intDay > (daysInMonth[new Integer(intMonth).intValue() - 1]).intValue()) {
          return new Boolean(false);
        }
        if ( (intMonth == 2) && (intDay > daysInFebruary(intYear).intValue())) {
          return new Boolean(false);
        }    return new Boolean(true);
      }  /**
       * 判断给定年份的2月份有多少天
       * @param year int 给定的年份
       * @return Integer 返回的天数
       */
      private static Integer daysInFebruary(int year) {
        return new Integer( ( (year % 4 == 0) && ( (! (year % 100 == 0)) || (year % 400 == 0))) ? 29 :
                           28);
      }  /**
       * 校验一个字符串是否为一个有效的日期数字(1-31以内)
       * @param day String 要校验的日期字符串
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isDay(String day) {    if (!isNotNull(day).booleanValue()) {
          return new Boolean(false);
        }    if (!isIntegerInRange(day, new Integer(1), new Integer(31)).booleanValue()) {
          return new Boolean(false);
        }    return new Boolean(true);
      }  /**
       * 校验一个字符串是否为一个有效的年份数字(必须由2位或4位数字组成)
       * @param year String 要校验的年份字符串
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isYear(String year) {    if (!isNotNull(year).booleanValue()) {
          return new Boolean(false);
        }    if (!isValidNegative(year).booleanValue()) {
          return new Boolean(false);
        }    if (! ( (year.length() == 2) || (year.length() == 4))) {
          return new Boolean(false);
        }    return new Boolean(true);
      }  /**
       * 校验一个字符串是否为一个有效的月份数字(1-12以内
       * @param month String 要校验的月份字符串
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isMonth(String month) {    if (!isNotNull(month).booleanValue()) {
          return new Boolean(false);
        }    if (!isIntegerInRange(month, new Integer(1), new Integer(12)).booleanValue()) {
          return new Boolean(false);
        }    return new Boolean(true);
      }    /**
       * 校验一个字符串是否非空
       * @param validateString String 要校验的字符串
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isNotNull(String validateString) {    return new Boolean( (validateString != null && !"".equals(validateString)));
      }    /**
       * 判断一个整数型字符串是否在定义区间内
       * @param validateStr String 要校验的字符串
       * @param indexStart Integer 定义区间最小值
       * @param indexEnd Integer 定义区间最大值
       * @return Boolean 返回的布尔类型对象
       */
      private static Boolean isIntegerInRange(String validateStr, Integer indexStart, Integer indexEnd) {    if (!isNotNull(validateStr).booleanValue()) {
          return new Boolean(false);
        }    if (!isSignedInteger(validateStr).booleanValue()) {
          return new Boolean(false);
        }    int num = Integer.parseInt(validateStr);    if (! ( (num >= indexStart.intValue()) && (num <= indexEnd.intValue()))) {
          return new Boolean(false);
        }    return new Boolean(true);
      }
      

  4.   

    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    if((year%4==0 && year%100!=0) || year%400==0)
     days[1]=29;
      

  5.   

    再次服了大家!!!c.getActualMaximum(Calendar.MONTH);//获得当月实际天数
    c.getMaximum(Calendar.MONTH);//获得月份域可达最大天数注意月份从0开始
      

  6.   

    //Create a calendar object of the desired monthCalendar cal=new GregorianCalendar(2000,Calendar.FEBRUARY,1);
    int days=cal.getActualMaximum(Calendar.DAY_OF_MONTH);  //29
      

  7.   

    是呀,怎么比我的还烦,funcreal(为中华之崛起而编程)的好像要简单一些。谢谢!
    还有个问题,我想要用js实现。当在下拉列表中选中月份的时候,后面相应的日期列表也随着动态的更改,能否给个完整一点的例子?谢谢!
      

  8.   

    谢谢,有收获,calendar这个类没有仔细的看过每个接口。
      

  9.   

    给你一个很简单的方法:   //返回某年某月的天数
       public int checkMonth(int year,int month)
       {
           GregorianCalendar gregoriangalendar = new GregorianCalendar();
           if(month==1 | month==3 | month==5 | month==7 | month==8 | month==10 | month==12)
               return 31;
           if(month==4 | month==6 | month==9 | month==11)
               return 30;
           else
           {
               if(gregoriangalendar.isLeapYear(year))//判断是不是闰年
                   return 29;
               else
                   return 28;
           }
       }
      

  10.   

    Calendar c;//忘了写了
    c.getActualMaximum(Calendar.MONTH);//获得当月实际天数
    c.getMaximum(Calendar.MONTH);//获得月份域可达最大天数在这个之后回答楼主第一个问题的人是不是眼睛都X了阿.难道看不见正确答案吗?
      

  11.   

    我想要用js实现。当在下拉列表中选中月份的时候,后面相应的日期列表也随着动态的更改,能否给个完整一点的例子?谢谢!我说楼主啊,你自己能不能动点脑子呢,你都知道,这个月最多有多少天了,你说你能不能写个for循环阿,输出日期的时候。实在不想害你,如果你是学习的目的。
    实在不想帮你,如果你是工作。(原因很简单啊,你给谁钱了吗?)