Calendar类如何计算月数?

时间:2015-10-15 07:41:13

标签: java datetime time

我对日历类有一个非常烦人的问题。我有两个JTextField来输入一个日期(txtStart& txtEnd)。如果开始日期从月份的第一天(01.)开始,我将结束日期设置为“月的最后一天”。

现在,用户可以通过单击加号或减号按钮来更改周期,然后我只想增加或减少开始月份和周期。结束日期。

Calendar tempStart = Calendar.getInstance();
Calendar tempEnd = Calendar.getInstance();

    if (txtStart.getText().trim().startsWith("01.")) {
      System.out.println("get dates typed by user, and set \"last day of month\" to txtEnd");

      tempStart = convStringToDate(txtStart.getText().trim(), false);
      System.out.println(tempStart.getTime() + "  #+#+###++ ");

      tempEnd = getLastDayOfMonth(txtStart.getText().trim());
      System.out.println(tempEnd.getTime() + "  #+#+###++ ");

      System.out.println("  ");

      System.out.println("multi is either +1 or -1, increasing or decreasing only the month !");

      tempStart.set(Calendar.MONTH, tempStart.get(Calendar.MONTH) + multi);
      System.out.println(tempStart.getTime() + "  #+#+###++ ");

      tempEnd.set(Calendar.MONTH, tempEnd.get(Calendar.MONTH) + multi);
      System.out.println(tempEnd.getTime() + "  #+#+###++ ");

      System.out.println("  ");
    }

我的方法工作正常。现在我得到了一些令人眼花缭乱的输出。

如果我在txtStart(dd.MM.yyy)输入01.11.2015,我得到以下输出:

get dates typed by user, and set "last day of month" to txtEnd
Sun Nov 01 00:00:01 GMT 2015  #+#+###++ 
Mon Nov 30 23:59:59 GMT 2015  #+#+###++ 

multi is either +1 or -1, increasing or decreasing only the month !
Tue Dec 01 00:00:01 GMT 2015  #+#+###++ 
Wed Dec 30 23:59:59 GMT 2015  #+#+###++

看起来很漂亮,外翻似乎工作正常,但如果我在txtStart(dd.MM.yyy)输入01.10.2015,我得到以下输出:

get dates typed by user, and set "last day of month" to txtEnd
Thu Oct 01 00:00:01 GMT 2015  #+#+###++ 
Sat Oct 31 23:59:59 GMT 2015  #+#+###++ 

multi is either +1 or -1, increasing or decreasing only the month !
Sun Nov 01 00:00:01 GMT 2015  #+#+###++ 
Tue Dec 01 23:59:59 GMT 2015  #+#+###++

任何人都知道为什么我的结束日期在输出2错了。

编辑: multi = +1或-1(参见output1或output2注释)

private Calendar getLastDayOfMonth(String sDate) {
  Calendar cal = convStringToDate(sDate, true);
  // passing month-1 because 0-->jan, 1-->feb... 11-->dec
  //    calendar.set(year, month - 1, 1);
  cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
  cal.set(Calendar.HOUR_OF_DAY, MAX_ZEIT[0]); //  23
  cal.set(Calendar.MINUTE, MAX_ZEIT[1]);  //  59
  cal.set(Calendar.SECOND, MAX_ZEIT[2]);  //  59
  cal.set(Calendar.MILLISECOND, MAX_ZEIT[3]); //  0
  //    Time: 23:59:59:0

  return cal;
}
##############解决方案:####################。
    if (txtStart.getText().trim().startsWith("01.")) {
      tempStart = convStringToDate(txtStart.getText().trim(), false);
      tempEnd = (Calendar) tempStart.clone(); // set the date somewhere at the same month ( e.g. at start date )

      tempStart.set(Calendar.MONTH, tempStart.get(Calendar.MONTH) + multi); // inc- or decrease the month first
      tempEnd.set(Calendar.MONTH, tempEnd.get(Calendar.MONTH) + multi); // inc- or decrease the month first ( now there is no overflow due to the 30th or 31th day )

      tempEnd = getLastDayOfMonth(df2.format(tempEnd.getTime())); //  finally setting the "last day of month" 
    }

解决方案是首先增加或减少月份,之后我可以设置月份的最后一天而不会出现任何溢出问题。

输出:

get dates typed by user, and set "last day of month" to txtEnd
Thu Oct 01 00:00:01 GMT 2015  #+#+###++ 
Thu Oct 01 00:00:01 GMT 2015  #+#+###++ 

multi is either +1 or -1, increasing or decreasing only the month !
Sun Nov 01 00:00:01 GMT 2015  #+#+###++ 
Sun Nov 01 00:00:01 GMT 2015  #+#+###++ 

 FINALLY 
Sun Nov 01 00:00:01 GMT 2015  #+#+###++ 
Mon Nov 30 23:59:59 GMT 2015  #+#+###++ 

我感谢大家的帮助!!!

2 个答案:

答案 0 :(得分:3)

第一个示例中的结束日期也不正确。它显示30/12,而12月的最后一天是31。当您在月份中添加+1时,您不会检查下个月是否具有相同的天数。

11月有30天。因此,10月31日的增加给了11月31日"实际上是12月1日。

许多程序员需要对日期进行算术运算。这就是为什么java.util.Calendar类有一个你可以使用的方法add()封装了你需要的所有计算。检查JavaDocs:http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#add(int,%20int)

答案 1 :(得分:0)

在增加或减少开始日期的月份后,使用

int lastDayOfMonth = startDate.getActualMaximum(Calendar.DAY_OF_MONTH);

并将startDate与设置为此值的日期结合使用作为endDate。

Calendar sd = new GregorianCalendar( 2015, 1, 1 );
int last = sd.getActualMaximum(Calendar.DAY_OF_MONTH);
Calendar ed = new GregorianCalendar( sd.get(Calendar.YEAR),
                                     sd.get(Calendar.MONTH),
                                     last );
System.out.println( sd.getTime() + " " + ed.getTime() );

sd.add( Calendar.MONTH, 1 );
last = sd.getActualMaximum(Calendar.DAY_OF_MONTH);
ed = new GregorianCalendar( sd.get(Calendar.YEAR),
                            sd.get(Calendar.MONTH),
                            last );
System.out.println( sd.getTime() + " " + ed.getTime() );