java.util.Calendar

  JDK中的java.util.Calendar类主要是用来处理日期和时间相关的算法运算。当你需要做一些关于日期和时间的高级算数操作时,此类可能就是你的最好选择。实际上,java.util.Calendar是一个抽象类,意味着不能直接实例化该类的对象来使用。原因是世界范围存在不止一种日历表示法,比如一种称为Arab日历就与大都数西方国家所使用的日历法不一样,还比如中国的农历法等。

java.util.GregorianCalendar

  JDK中的GregorianCalendar类是java.util.Calendar的一个,也是唯一的一个子类,代表的就是世界范围使用最广泛的公历法。通常的使用示例如下:

Calendar cr = new GregorianCalendar();

正如我们前面所述,Calendar类(包括java.util.Calendar和GrogorianCalendar)包含有很多获取年份、月份、天数等日期时间信息的简便方法。需要注意:Calendar类里面是包含着时区信息的,如果构造该类的对象时没有指定具体的时区信息,默认采用的JVM中时区信息。该类的通常的操作如下:

Calendar cr = new GregorianCalendar();
int year = cr.get(Calendar.YEAR);
int month = cr.get(Calendar.MONTH);
int hour = cr.get(Calendar.HOUR);
int minute = cr.get(Calendar.MINUTE);

Calendar类中的实际含有方法较多,具体的所有方法可直接查看JavaDoc。正如你所猜想的那样,该类具有大量的set方法,简单举例如下:

Calendar cr = new GregorianCalendar();
cr.set(Calendar.YEAR, 2017);

cr.set(Calendar.MONTH, 11); // 11 = 12月份

  作为日期和时间算数运算的工具类,Calendar类含有大量的add方法来修改对象的相应域,从而改变对象所代表的日期和时间。更重要的是这些add方法可以完全正确地处理跨域问题。举例如下:

Calendar cr = new GregorianCalendar();

cr.set(Calendar.YEAR, 2017);
cr.set(Calendar.MONTH, 11); // 11=12月份
cr.set(Calendar.DAYOFMONTH, 31);

cr.add(Calendar.DAYOFMONTH, 1);

int year = cr.get(Calendar.YEAR); // now 2018
int month = cr.get(Calendar.MONTH): // now 0
int dayOfMonth = cr.get(Calendar.DAYOFMONTH); // now 1
仔细观察会发现,该类中没有相应的subtract方法,减法也是通过使用add方法,只需要把值改成负值就行啦。

cr.add(Calendar.DAYOFMONTH, -1);

  关于Calendar类,有几个注意点需要大家了解:
1. Calendar类中 MONTH 域的合法取值是 0 到 11,分别对应 1 到 12 月份
2. Calendar类中星期的计数是从 1 到7 ,但是 1 代表的是 星期日
3. Calendar类对于错误的域值设置会如何处理?需要查看JavaDoc或者查看该类的源码

java.util.TimeZone

  JDK中使用java.util.TimeZone类来代表时区的概念,该类主要结合Calendar类来使用,在Calendar类处理跨时区计算日期时间时非常有帮助。注意:在JDK8中是使用java.time.ZoneId来表示现实世界中的时区概念。通常的设置和获取Calendar类的时区域示例代码如下:

Calendar cr = new GregorianCalendar();
TimeZone timeZone = cr.getTimeZone();
cr.setTimeZone(timeZone);

正如前文所述,如果不特别指定,Calendar对象会使用JVM中的默认时区对象。实际上,TimeZone类本身提供了两个获取该类示例对象的方法,代码如下:

TimeZone tZ = TimeZone.getDefault();
TimeZone tZ = TimeZone.getTimeZone("Europe/Copenhagen");

第一方法获取的是JVM中的默认时区对象,着也是Calendar对象获取时区对象的方式;第二个方法获取给定时区ID("Europe/Copenhagen")的时区对象。   TimeZone对象含有获取其基本信息的方法,如下示例所示:

tZ.getDisplayName();
tZ.getID();
tZ.getOffset(System.currentTimeMillis());

此处需要注意getOffset(long)方法,由于时令的影响,该方法在夏季和冬季调用返回的值可能不一样。通过结合Calendar和TimeZone,Calendar类可以用来在不用的TimeZone之间做日期和时间的转换,转换的基础是不同TimeZone的Calendar对象中的毫秒值是一样的。我们知道,世界范围内的时区ID是非常多的,JDK中支持具体详情可通过如下方法查看:

TimeZone.getAvailableIDs();

本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。

                

JDK中日期和时间的几个常用类浅析(二)的更多相关文章

  1. JDK中日期和时间的几个常用类浅析(四)

    java.time.Instant   java.time.Instant类对应的是时间线上的一个时间点.该类通过保存着从格林威治的起始时间(1970年一月一日零点零分)开始计算所经过的纳妙数来表示时 ...

  2. JDK中日期和时间的几个常用类浅析(五)

    LocalDateTime   LocalDateTime是JDK8中才引入的类,用来表示不包含时区信息的本地日期和时间.我们可以把LocalDateTime看作是LocalDate和LocalTim ...

  3. JDK中日期和时间的几个常用类浅析(三)

    java.text.SimpleDateFormat   SimpleDateFormat类是用于把字符串解析成日期时间和把日期时间格式化成字符串的工具类.该类主要和java.util.Date类配合 ...

  4. Python中日期和时间格式化输出的方法

    本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...

  5. 5 个关于 API 中日期和时间设计规则

    规则 #1 使用ISO-8601格式作为你的日期格式 ISO 8601 解决了很多问题,包括: 自然排序 - 简单和优雅,免去多余的工作即可实现排序 时区偏移 - 代表用户的地点和时区在日益增长的全球 ...

  6. java中的常用类(二)

    java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...

  7. PHPExcel对于Excel中日期和时间类型的处理

    PHPExcel是一款优秀的处理Excel文件读写的开源PHP Library,能够给我们提供强大的Excel读写能力,本文针对Excel处理过程中关于日期和时间类型的处理进行深入的讨论.PHPExc ...

  8. SqlServer中日期和时间数据类型及函数 【转】

    来源:http://blog.csdn.net/royalwzy/article/details/6446075 日期和时间数据类型 下表列出了 Transact-SQL 的日期和时间数据类型. 数据 ...

  9. JAVA中日期和时间的格式化选项

    一.使用printf方法 import java.util.Date; import java.util.Scanner; public class Test { public static void ...

随机推荐

  1. 特殊字符html,css转义大全

    使用方法: 这些字符属于unicode字符集,所以,你的文档需要声明为UTF-8: 下面符号列表的后面有两列编号,它们并不太一样,第一列是用于html的,你需要在前面加上&#符号: 第二列可以 ...

  2. CSS中:visited的隐私保护

    CSS 伪类 (Pseudo-classes) 锚伪类:在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态. a:lin ...

  3. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

  4. 记录UITextField删除状态

    self.testTextField.leftView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; self.testTextField. ...

  5. Unity编程标准导引-3.2 MonoBehavior 组件父类重构

    本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 3.2MonoBehavior 组件父类重构 为了让我们的组件类用起来更方便,我们将上一节的 ...

  6. InnoDB和Foreign KEY Constraints

    InnoDB表中中Foreign Key定义 1. InnoDB允许a foreign key引用一个索引列或者索引组列. 2. InnoDB现在并不支持用户定义的分区表有foreign keys,这 ...

  7. ReactNative入门(2)ECMAScript 6简介

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  8. Linux内核时间管理(二)——jiffies与jiffies_64释疑

    Linux内核中定义了jiffies变量来记录从系统启动到当前时刻系统时钟所产生的tick数.jiffies变量是一个无符号整型数值,即unsigned long类型.它的声明如下(在 include ...

  9. NFS安装及配置

    NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个 ...

  10. 【转】Hibernate和IBatis对比

    原文地址:http://blog.csdn.net/ya2dan/article/details/7396598 项目也做过几个, 使用IBatis就做一个项目, 基本上都是使用Hibernate, ...