毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

Calendar类的roll()方法怎么用

更新时间:2013-6-11:  来源:毕业论文

Calendar类的roll()方法怎么用

运行了一下,结果跟API写得不符合,请高手帮忙找找错...

这是我测试的代码:
package com.ocjp.g11n;
import java.util.*;

public class CalendarTest {
 public static void main(String[] args) {
 Calendar c = Calendar.getInstance();
 c.set(1999,8,31);
//  System.out.println(c.getTime());
 c.roll(Calendar.MONTH, 13); //API写的,输出应该是1999,9,30.理由是roll()传的参数是MONTH,roll()不会调整比当前参数大的字段,也就是不调整YEAR;比当前参数小的字段,本例中为DAY,如果超出范围了,取最接近的值;所以这行代码,在原来8月的基础上+13,月份应该变成9,但9月没有31天,就自动调整为30;年份不变,为什么我运行的结果不对呢?
 System.out.println(c.getTime());
 c.add(Calendar.DATE, 10);
 System.out.println(c.getTime());
 }
}

输出为:
Mon Nov 01 23:35:00 EST 1999
Thu Nov 11 23:35:00 EST 1999

为什么我测试的结果跟API写的不一样?我把API内容COPY如下:

Example: Consider a GregorianCalendar originally set to August 31, 1999. Calling add(Calendar.MONTH, 13) sets the calendar to September 30, 2000. Add rule 1 sets the MONTH field to September, since adding 13 months to August gives September of the next year. Since DAY_OF_MONTH cannot be 31 in September in a GregorianCalendar, add rule 2 sets the DAY_OF_MONTH to 30, the closest possible value. 

原因是,java/javascript的月,都是基于0的
也就是1月=0,12月=11,参考java.util.Calendar#JANUARY

你set(1999,8,31)最终设置的是1999年9月31日,也就是10月1日,于是...

java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd");          Calendar c = Calendar.getInstance();                   c.set(1999, 7, 31); //1999-8-31                     System.out.println("=======add()================");          System.out.println("1、规则第一条:");          System.out.println("当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。");          System.out.println("2、规则第二条:");          System.out.println("当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。");          System.out.println("****************************");                                //规则1: 没有超出范围,不用改变大的字段(年份不变)          c.add(Calendar.MONTH, 1); //1999-9-31 => 1999-10-1,对吗?         //规则2:比其小的字段(日期改变),变化最小值,为30即可          System.out.println(df.format(c.getTime())); //结果是 1999-9-30                     //再如          c.set(1999,7,31);    //1999-8-31             //规则1:超出范围,改变大的字段(年份为2000年) 2000-9-31  9月没有31         //规则2:比其小的字段(日期改变),变化最小值,为30即可 ==> 变成 2000-9-30              c.add(Calendar.MONTH, 13);                System.out.println(df.format(c.getTime())); //结果是 2000-9-30                                System.out.println("===========Roll()============");          System.out.println("规则只有第二条:");          System.out.println("当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。");          System.out.println("*****************************");          //使用 roll          c.set(1999,7,31);    //1999-8-31          //没有规则1:roll 不改变年份,1999-21-31 -->1999-9-31  9月没有31          //只有规则2:比其小的字段(日期改变),变化最小值,为30即可 ==> 变成 1999-9-30              c.add(Calendar.MONTH, 13);               System.out.println(df.format(c.getTime())); //1999-09-30                                                      //你的代码 8 表示9月 1999-09-31,9月没有31,应该为1999-10-1           System.out.println("=======set()================");          System.out.println("set() 会自动转换为合法的日期,如 set(1999,8,31) ");          System.out.println("表示的是1999-09-31,9月没有31,应该为1999-10-1     ");          System.out.println("*****************************");          c.set(1999,8,31); // 1999-09-31 9月没有31 -->1999-10-1                   System.out.println(df.format(c.getTime()));//1999-10-1              c.roll(Calendar.MONTH, 11); //1999-21-01 ==>1999-09-01               System.out.println(df.format(c.getTime()));    //1999-09-01

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。