范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

java基础系列Calendar类

  一、概述
  Java官方推荐使用Calendar来替换Date的使用。
  Calendar与Date之间可以自由的进行转换,转换的纽带是time。
  使用Calendar的getTime()方法可以得到一个Date类型的对象,这个对象底层是使用Date的第二个带Long型参数的构造器创建的,这个Long型参数是Calendar中的time字段中保存的值,这个time字段的值是在具体的实现类中定义赋值的。
  比如GregorianCalendar中的实现computeTime(),这个方法的目的就是将field值转换为time值,这个涉及到Calendar中的两种模式,之后会有介绍。
  而通过Calendar的setTime(Date date)方法可以将一个Date对象转换为一个Calendar对象,这个方法以一个Date对象为参数,底层调用的setTimeInMillis(long millis)方法,将date.getTime()的值作为参数,再底层会将这个Long型参数值赋值给time字段,这时会重计算field值。
  Calendar与Date的转换: public class CalendarTest {     public static void main(String[] args) {         //Calendar--->Date         Calendar c = Calendar.getInstance();         Date d = c.getTime();         //Date--->Calendar         Date d1 = new Date();         Calendar c1 = Calendar.getInstance();         c1.setTime(d1);                  System.out.println(d);         System.out.println(c1.get(Calendar.YEAR)+"年"+(c1.get(Calendar.MONTH)+1)+"月"+c1.get(Calendar.DATE)+"日");     } }
  执行结果: Sat Jul 08 10:39:14 CST 2017 2017年7月8日二、Calendar中的time与field
  Calendar中有两种描述时间内容的域,一种就是time,它用来保存Calendar对象所代表的时间点据1970年1月1日 00:00:00的毫秒数,另一种就是field,它是一个数组,它表示的并不是一个内容,而是Calendar内部定义的最多静态常量字段。
  而这一般情况下是同步的,即表述的是同一时间点,但也有可能会出现不同步的情况: 起初,field没有设置,time也是无效的 如果time被设置,所有的field都会自动被设置为同步的时间点 如果某一field被单独设置,time会自动失效
  更确切的说,当我们通过Calendar.getInstance()方法获取一个全新的Calendar对象时,它所代表的时间点是通过time来设置的,而这个time的值是通过System.currentTimeMillis()得到的,通过time定义Calendar,isTimeSet为true,表示time值是最新的(真的),areFieldsSet为false,表示field字段的值都是旧的(假的),因为当我们重新设置了time值之后,Calendar所代表的时间点就发生了变化(这里是首次,相当于从无到有,也算是变化,之后当我们为Calendar的time重新设置一个新值时,Calendar的时间点就会再次发生变化,它会指向最新的time值所代表的时间点),而这时field中还表示的是原来的时间点内容,然后会调用computeFields()方法进行所有字段值的重计算,确保field中的值与time同步,并同时将areFieldsSet和areAllFieldsSet设置为true,表示所有的field代表的时间值也是最新的了(真)。其实我们每次更改time值都会自动触发重计算,来确保两个域所描述的时间点一致(即同步),这也就是上面b所述的内容。
  但是如果我们通过set(int field, int value)单独对field中的某行一字段进行更改时,首先会触发一个验证,areFieldsSet为真而areAllFieldsSet为false时,表示只有一部分field是最新的情况,即存在部分field属于旧的情况,针对这种情况会触发field的重新计算;之后会将isTimeSet设置为false,areFieldsSet设置为false,将isSet[field]设置为true(将当前field设置为真),这种情况下,当我们使用getTime()获取time值所代表的时间点时,由于isTimeSet为false,会触发time的重计算,这个计算依据是根据field的值进行的,之后将isTimeSet设置为true,同样我们在通过get(int field)获取某个field值时也会先验证isTimeSet是否为true,如果为false,同样会触发time的重计算,然后验证areFieldsSet为false,则触发其余field的重计算。
  time的重计算是依据field的,确切地说是依据部分field的,而有一部分field也是在field的基础上再计算的,所以可以说有一部分field是固定的,是和time息息相关的。
  以上种种所述全部是Calendar内部的实现规则,对外而言,我们只需要简单的调用即可,所有这些都被隐藏在内部,从而保证我们通过对外方法获取到的直接就是正确的值。
  过程实例: public class CalendarTest {     public static void main(String[] args) throws ParseException {         System.out.println("-------初始情况-------");         Calendar c = Calendar.getInstance();         System.out.println(c.getTime());         System.out.println(c.get(Calendar.DATE));         System.out.println(c.get(Calendar.HOUR));         System.out.println("-------重设置time-------");         c.setTime(new SimpleDateFormat("yyyyMMdd").parse("20170501"));         System.out.println(c.getTime());         System.out.println(c.get(Calendar.DATE));         System.out.println(c.get(Calendar.HOUR));         System.out.println("-------重设置field-------");         c.set(Calendar.MONTH, 4);         System.out.println(c.getTime());         System.out.println(c.get(Calendar.DATE));         System.out.println(c.get(Calendar.HOUR));         System.out.println("总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成");     } }
  执行结果: -------初始情况------- Sat Jul 08 13:08:34 CST 2017 8 1 -------重设置time------- Mon May 01 00:00:00 CST 2017 1 0 -------重设置field------- Mon May 01 00:00:00 CST 2017 1 0 总结:time与field所代表时间点同步,所有的不同步全部在内部处理完成 三、Calendar中的两种解析模式lenient:该模式下可以自动规则化用户赋值给Calendar的不规则值,比如1月32日会被解析为2月1日 non-lenient:该模式下不会自动解析不规则的输入,而是一旦发现不规则输入,就会报出异常
  这也叫Calendar的容错性,lenient的开启与关闭使用setLenient(boolean lenient)方法来设置,true表示开启容错性(默认情况),false表示关闭该功能。
  实例: public class CalendarTest {     public static void main(String[] args) {         Calendar c = Calendar.getInstance();         c.set(Calendar.MONTH, 8);         c.set(Calendar.DAY_OF_MONTH, 33);         System.out.println(c.getTime()+" ");         c.setLenient(false);         c.set(Calendar.MONTH, 8);         c.set(Calendar.DAY_OF_MONTH, 33);         System.out.println(c.getTime());     } }
  执行结果: Tue Oct 03 13:18:48 CST 2017  Exception in thread "main" java.lang.IllegalArgumentException: DAY_OF_MONTH     at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2583)     at java.util.Calendar.updateTime(Calendar.java:2606)     at java.util.Calendar.getTimeInMillis(Calendar.java:1118)     at java.util.Calendar.getTime(Calendar.java:1091)     at JdkTest.main(JdkTest.java:87)
  从上面的例子中可以看出,默认情况下,我们为Calendar的月份赋值为8即九月份,日期赋值为33即下一月3号,输出为10月3日,容错性将这种不符合规则的输入规则化处理了,而关闭容错性之后,同样的赋值只会报异常java.lang.IllegalArgumentException(非法参数异常)。 四、Calendar的使用
  实例: public class CalendarTest {     public static void main(String[] args) throws ParseException {         //通过SimpleDateFormat解析日期字符串         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm:ss.SSS");         Date date = sdf.parse("20170502 13:33:23.433");         //将Date格式日期转换成Calendar         Calendar c = Calendar.getInstance();         c.setTime(date);         //获取时间值         System.out.println(c.getTime());         System.out.println("年份为"+c.get(Calendar.YEAR));         System.out.println("月份为"+c.get(Calendar.MONTH));         System.out.println("日期为"+c.get(Calendar.DATE));         System.out.println("日期为"+c.get(Calendar.DAY_OF_MONTH));         System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK));         System.out.println("日期为"+c.get(Calendar.DAY_OF_WEEK_IN_MONTH));         System.out.println("日期为"+c.get(Calendar.DAY_OF_YEAR));         System.out.println("时为"+c.get(Calendar.HOUR));         System.out.println("时为"+c.get(Calendar.HOUR_OF_DAY));         System.out.println("分为"+c.get(Calendar.MINUTE));         System.out.println("秒为"+c.get(Calendar.SECOND));         System.out.println("毫秒为"+c.get(Calendar.MILLISECOND));         System.out.println("星期为"+c.get(Calendar.WEEK_OF_MONTH));         System.out.println("星期为"+c.get(Calendar.WEEK_OF_YEAR));         System.out.println("历型为"+c.get(Calendar.ERA));         System.out.println("zone为"+c.get(Calendar.ZONE_OFFSET));         //设置         c.set(Calendar.MONTH, Calendar.APRIL);         System.out.println("修改后月份为"+c.get(Calendar.MONTH));         c.set(1999, 0, 23);         System.out.println(c.getTime());         c.set(2000, 1, 12, 13, 33, 14);         System.out.println(c.getTime());         c.set(2001, 2, 13, 14, 13);         System.out.println(c.getTime());         //运算         System.out.println("-----运算-----");         c.add(Calendar.YEAR, 12);         System.out.println(c.getTime());         c.add(Calendar.MONTH, -1);         System.out.println(c.getTime());         c.roll(Calendar.DATE, true);         System.out.println(c.getTime());         c.add(Calendar.DATE, 1);         System.out.println(c.getTime());         //roll与add运算对比         c.set(2000, 1, 29);         System.out.println(c.getTime());         c.roll(Calendar.DATE, 1);         System.out.println(c.getTime());         c.set(2000, 1, 29);         c.add(Calendar.DATE, 1);         System.out.println(c.getTime());     } }
  执行结果为: Tue May 02 13:33:23 CST 2017 年份为2017 月份为4 日期为2 日期为2 日期为3 日期为1 日期为122 时为1 时为13 分为33 秒为23 毫秒为433 星期为1 星期为18 历型为1 zone为28800000 修改后月份为3 Sat Jan 23 13:33:23 CST 1999 Sat Feb 12 13:33:14 CST 2000 Tue Mar 13 14:13:14 CST 2001 -----运算----- Wed Mar 13 14:13:14 CST 2013 Wed Feb 13 14:13:14 CST 2013 Thu Feb 14 14:13:14 CST 2013 Fri Feb 15 14:13:14 CST 2013 Tue Feb 29 14:13:14 CST 2000 Tue Feb 01 14:13:14 CST 2000 Wed Mar 01 14:13:14 CST 2000
  对比上面最后的两行输出,可以看出add与roll的运算规则其实是不同的,roll的运算不会影响大规则(这里的大规则指的是月份的改变)的改变,而add会影响。
  综上所述,我们可以简单的认识一下Calendar类,并学会简单的使用它,对于其内部实现,还需要认真敲一敲源码。

云徙科技用数字中台助推客户企业全面转型周健报道云徙科技是一家领先的中台服务商。9月25日,云徙科技在杭州举行了2020云徙数字创新年会,邀请了超过400位龙头企业信息化相关人员共聚一堂,探讨中台在企业数字化创新中的应用云徙有Fans正和岛东部大区名企走进中台领导者云徙科技10月30日,正和岛携近六十位企业家走进双中台领导者云徙科技。近六十名企业家,通过融合参观体验互动等多种形式与数字中台亲密互动,共同探讨数字化时代的企业中台及中台之上数字营销新发展初代GalaxyFold获得OneUI3。1更新推送三星最近宣布将向老款Galaxy设备发布OneUI3。1更新。目前更新已经向GalaxyS20系列,GalaxyNote20系列,GalaxyZFold2,GalaxyZFlip,GalaxyM31s获得Android11更新在向GalaxyM21GalaxyM30sGalaxyM31和GalaxyA51等中端智能手机推送Android11更新后,三星发布了GalaxyM31s的OneUI3。0更新。G安卓11更新现已推出至GalaxyNote10Lite基于Android11的OneUI3。0更新现在正在向GalaxyNote10Lite推送。三星在此前48小时内开始部署,意料之中的是此次更新包含了2021年1月的安全补丁。几乎可GalaxyA52与A72的印度定价在发布前泄漏三星将于2021年3月17日举行的GalaxyUnpacked活动中推出中端智能手机GalaxyA52和GalaxyA72。不过在发布之前,这两款智能手机的印度定价都已曝光。根据最四摄骁龙750GGalaxyA725G首次正式曝光三星预计将推出2021款中端智能手机GalaxyA52和GalaxyA72。在过去的几周里,这两款设备的一些规格已经泄露,今天早些时候,GalaxyA525G的渲染图被发布到了互联三星向GalaxyNote10系列推送OneUI3。1三星在GalaxyS21系列中首次推出了OneUI3。1,然后在几周内将其推广到了老款设备上。在过去的几天中,OneUI3。1更新已推送到GalaxyS20系列,GalaxyNotGalaxyZFold3将支持SPenNote要再见据韩国媒体周一报道,GalaxyZFold3或将支持SPen。这将使其成为三星GalaxyNote系列手机之外的第二款支持此功能的智能手机,第一款是不到一个月前发布的GalaxyS或将搭载WearOS三星2021款智能手表的代号曝光据信,三星已经确认在2021年推出一款新的智能手表。如果最新的报告显示,有迹象表明三星实际上可能会推出两款机型。请注意,是两种完全不同的型号,不是同型号的两种不同尺寸。最新的报告带三星开始向GalaxyS21推送3月安全更新三星正在为全新GalaxyS21旗舰系列推送新的固件更新,并且正如预期的那样,更新包括2021年3月的安全补丁,该补丁早些时候针对其他少数Galaxy智能手机发布。更新日志看起来很
工信部下架APP是什么意思。会有什么后果?谢邀!我们在上网的时候,经常会看到工信部下架了某些APP的新闻,一些比较知名的APP比如天涯脉脉途牛等都曾经被工信部下架。很多网友好奇这是什么意思,以及APP如果被工信部下架会有什监测尘量黑科技,追觅无线吸尘器T30带来不一样的清洁体验写在前面吸尘器是大家非常熟悉的小家电,它也一直是笔者清扫整屋灰尘的主要工具,不过笔者目前使用的这款吸尘器存在着吸力小续航短配套刷头少等问题。追觅科技作为中国清洁领域的代表科技品牌之工信部副部长刘烈宏今日起新进网5G终端默认开启SA模式5月17日消息,在世界电信和信息社会日大会,工业和信息化部副部长刘烈宏表示,5月17日起,新进网5G终端将默认开启5G独立组网(SA)功能,加快基于5G的新型消费终端成熟。刘烈宏表苹果产品系统全面升级IOS15要来了最近苹果的降频门事件备受关注,苹果也是光速做出反映,最短的事件里更新了新的版本,14。6版彻底解决了11以及12升级后变卡的现象。最近又有消息指出,苹果公司将会在6月7日到11日举和苹果手表功能相近,外观相近却不是苹果手表,魅族手表它来了在Flyme9发布的时候,就透漏了关于魅族手表的消息,发布会上没有重点强调这款产品,只是说5月份会发布,伴随着5月即将过半,魅族又将重新定义五月,谁知道这时候魅族好队友电信eSIM偷偷模仿微信支付宝?日本移动支付上线仅4天,结果钱没了我们都知道,微信支付宝都是非常重视支付安全的,所以一直都没有出过大问题,得到了很多消费者的肯定,也成为了一些海外国家争先模仿的对象。日本的这款名为7pay的移动支付APP,也似乎在高端工业机器人不再受制于日本科技深一度高端工业机器人不再受制于日本洞见计划工业机器人的RV减速器,对制造业来说,相当于手机电脑的芯片,其核心技术和全球90的市场一直被日本垄断。当前国产机器人使用的RV减速器大鸿蒙系统更新使用之感受鸿蒙系统这几天一直是最热门的话题,更新差不多一个礼拜了,再谈一下这几天的使用感受,不喜勿喷啊祈祷祈祷祈祷首先呢纠正一个错误,前几天所说的个别app自动更新以后不能安装使用问题现在已全国17个城市滴滴司机免费领取好礼,平台感恩司机辛苦付出这几天,相信大家都被五一火爆的旅游数据刷屏了全国国内旅游出游2。3亿人次,再创历史新高。庞大的出游人群,也对各个城市的交通接待能力带去了巨大考验。因此,在今年五一小长假中,许多滴滴Chia硬盘矿第二大矿池突然跑路关闭提现通道最近Chia硬盘矿很火爆,不少人都投巨资升级硬盘挖矿,期待Chia能成为下一个比特币。但别忘了风险,日前第二大矿池UU跑路了,2万矿工惨了。币圈的平台矿池关键时刻拔网线不是传说,通美的也要造车?官宣5月18日发布新能源汽车新品点击右上角加关注,全国产经信息不错过TechWeb5月17日消息,据美的集团官方微信公众号消息,美的新能源汽车新品将于5月18日发布。据网上传出的消息,美的即将发布的新能源汽车新品