Calendar类要点、易错点

简介:

用于日期的计算。

是一个抽象类,得用它的静态方法getInstance()获取(它的子类)实例。(会根据地区的不同创建当地使用的日历)

将年月日等都存在了它的一个private数组里:fields[]。

年在该数组的下标存在了public static字段YEAR里,以此类推。

具体:

// set 设定某字段的值
// get 获取某字段的值
// add 增加某字段的值
// getTime 获取日历时间 表示的 Date对象
// getTimeInMillis 获取用毫秒数表示的日历时间
// setTime(date); 用Date对象给日历时间赋值
// getActualMaximum 获取某字段的最大值
Calendar cl = Calendar.getInstance();  //创建时间为当前时间的日历System.out.println(cl.get(Calendar.YEAR));
System.out.println(cl.get(Calendar.MONTH));cl.set(Calendar.MONTH, 1);
cl.add(Calendar.MONTH, -4);
Date d = cl.getTime();System.out.println(cl.get(Calendar.YEAR));
System.out.println(cl.get(Calendar.MONTH));
int m = cl.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(m);

运行结果:

2022
7
2021
9
31

一些意料之外的细节:

  1. 格列高利月历的Month是0 到 11!(中国默认格列高利月历,即公历)(其他字段从1开始,不含0)
  2. Calendar.HOUR默认是按12小时制处理,Calendar.HOUR_OF_DAY才是24小时。
  3. DAY_OF_WEEK,星期日对应的是1,星期六才是7。

易错点:

Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();   //比calendar1晚了几毫秒
calendar2.set(Calendar.DAY_OF_MONTH, 2);
calendar2.set(Calendar.DAY_OF_MONTH, 1);        //设置calendar2比calendar1早了一天
//计算calendar1\calendar2差了几天
long deltaDays = (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;
int days = (int) deltaDays;
System.out.println(days);

实际输出:

18

错误原因分析:

这是由于calendar2初始化晚于calendar1造成的。

从ms精度上来讲,calendar1-calendar2=一天-几毫秒<1天,整除1000x60x60x24后 等于 0.

(如果倒过来calendar1的日期比calendar2早,就不影响calendar1-calendar2的结果了,只会影响calendar2-calendar1的结果)

修改方法:

long deltaDays = (calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;
int days = (int) deltaDays;
if (calendar1.after(calendar2)){days++;
}
ps:如果这里days的计算方式如下,也会造成错误
int days = (int)(calendar1.getTimeInMillis()-calendar2.getTimeInMillis())/1000/60/60/24;

错误原因:

强制类型转换优先级比除法高,会先将getTimeInMillis()方法返回的long类型数字截断成为int,此处造成高置位不为0数字丧失。

解决方法:

在整个计算式外面加一个"()",改变计算优先级。由于整除后得到的数字不大于2 16 2^{16}216,故强制类型转换不会造成数值变化。

Calendar中的DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR

cal1.add(Calendar.DAY_OF_MONTH,1);
cal1.add(Calendar.DAY_OF_YEAR,1);
cal1.add(Calendar.DATE,1);

就单纯的add操作结果都一样,因为都是将日期+1
就没有区别说是在月的日期中加1还是年的日期中加1

但是Calendar设置DAY_OF_MONTH和DAY_OF_YEAR的目的不是用来+1
将日期加1,这通过cal1.add(Calendar.DATE,1)就可以实现

DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH),用来获得这一天在是这个月的第多少天
Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_YEAR),用来获得这一天在是这个年的第多少天。
同样,还有DAY_OF_WEEK,用来获得当前日期是一周的第几天

Calendar类要点、易错点Calendar中的DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR相关推荐

  1. 基于图和基于对齐的混合纠错方法在易错长读中的性能差异

    基于图和基于对齐的混合纠错方法在易错长读中的性能差异 王安琪& 金辉区 基因组生物学 卷 21,产品编号:  14(2020) 引用本文 2079次访问 1引文 18高度 指标细节 抽象 容易 ...

  2. Java 日期 calendar中 DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR

    calendar中 DATE 和 DAY_OF_MONTH 和 DAY_OF_YEAR 这几个字段名字起得确实有点.. 其中 DATE 和 DAY_OF_MONTH 都是 5 当前日期减去一天: pu ...

  3. 带你进入String类的易错点和底层本质分析!

    来源:https://my.oschina.net/liboware/blog/5076245 字符串拼接及创建的案例分析 案例一 String a = "test"; Strin ...

  4. java的易错点_java中易错点

    1.A instanceof  B{这是没有好好利用java多态的表现} java中的二元操作符,测试A对象是否是B类的实例: 返回值:boolean类型 2."=="与 &quo ...

  5. python3生成器类题目易错写法

    遍历 定义一个生成器列表 a = [(i for i in range(10))] 使用for遍历 for i in a:print(i) # <generator object <gen ...

  6. JAVA中Calendar类的常用方法

    Calender类 java.util.Calendar类:日历类 Canlender类是一个抽象类,里面提供了很多操作日历字段的方法(YEAR.Months.day_OF_MNTH.HOUR) Ca ...

  7. Date类与Calendar类

    一.Date类 1.认识Date类 java.util包下的Date类,Date对象既包含日期,该类从JDK1.0就开始有了,所以大部分的构造器和方法已经过时,编写时有时会报错. Date类一共有6个 ...

  8. JavaSE核心之一:Date类、Calendar类、Math类、枚举;

    1.Date类 1) java.util.Date类用于封装日期及时间信息,一般仅用它显示某个日期,不对他作任何操作处理,作处理用Calendar类,计算方便. 2) Date 类本质上拥有一个lon ...

  9. calendar类计算时间距离_日期时间--JAVA成长之路

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

最新文章

  1. go定时器 每天重复_通过测试学习Go:Hello, World
  2. 四大指标超现有模型!少样本的无监督图像翻译效果逆天| 技术头条
  3. educoder python入门之基础语法-用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...
  4. oracle行级的触发器,Oracle触发器Trigger2行级
  5. ASP.NET Core 基于角色的 JWT 令牌
  6. PS教程第十七课:放大看 缩小看
  7. 输入框回车多个文本_输入框测试用例,你真的了解输入框测试嘛!
  8. (六)Docker简介
  9. Android开发网
  10. L2-030 冰岛人 (25 分)-PAT 团体程序设计天梯赛 GPLT
  11. could not connect to server: No route to host Is the server running on host 192.168.163.181 and a
  12. c# 串口发送接收数据
  13. java ts视频文件合并
  14. 2022考公务员难还是考研难?
  15. 【NTL密码算法开源库-概述】
  16. 安装Ubuntu的几十次坑的经验
  17. Vue开发仿京东商场app
  18. 25 行 Python 代码实现人脸检测——OpenCV 技术教程
  19. 初学者如何快速开发大数据分析平台
  20. sony公司关于什么是逐行扫描的解释 .转载并注释

热门文章

  1. idea pom文件全部爆红
  2. markdown stackedit 与cnblogs 结合写博客
  3. 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)
  4. 【easyexcel】导入到数据库功能 正版实测
  5. 评定成绩级别和查询学生成绩
  6. SQL排序函数+排名函数使用
  7. presto 0.166概述
  8. python,爬取微信好友数据,看他一天天在干嘛
  9. List of Keywords in Python
  10. JAVA空间滤波——中值滤波