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. .net 开发经理的月薪

    因为各人的成长不一样,有人工作了5年,技术也只能当个高级程序员,有人工作了两年,就能带领一个团队,有人在初中时期就写了一个很牛X 的框架,而我工作也快5年,也努力奋斗了5年,我觉得自己有能力做开发经理 ...

  2. ubuntu更换内核版本

    一 详细的使用方法见: http://www.xlgps.com/article/310954.html 二 补充: 1 需要删除旧的内核的方法: sudo apt-get remove linux- ...

  3. Hibernate调用带有输入参数,输出参数为cursor的存储过程

    一.Oracle创建表及存储过程 1.创建表T_MONITOR_DEVICE 创建后的表结构 2.创建存储过程 create or replace procedure ProcTestNew(v_mo ...

  4. db_link

    1.查询 SYSDBA登录, sys登录    SELECT * FROM SYS.link$; select owner,object_name from dba_objects where obj ...

  5. 安装第三方包web.py发生的错误

    今天新学到了python的模块方面的内容,我的版本是python2.7.13 想安装第三方包web.py的时候, 命令提示符 输入 pip install web.py 总是提示如下错误 You ar ...

  6. 2017年2月16日 分析下为什么spring 整合mybatis后为啥用不上session缓存

    因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...

  7. ubuntu ssh-keygen Permission denied

    ubuntu下生成github上的ssh keys,执行: ssh-keygen 直接执行: sudo chown user1:user1 /home/user1/.ssh -R 成功生成.

  8. 【UWP】列表项宽度自适应的实现

    目的 在UWP开发中,我们常常用到两个显示列表的控件:ListView和GridView.而这两个列表控件在PC等大屏幕上如果能多列"智能"调整自己的大小(通常是根据当前窗口大小调 ...

  9. .NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线

    Powered by ASP.NET Core on Linux! 我们全站的 .NET Core 迁移工作如火如荼,这是我们今年上半年的重要工作. 今天我们终于完成了博问产品(q.cnblogs.c ...

  10. oracle系列笔记(2)---多表查询

    多表查询     这篇文章主要讲四点: (1)oracle多表查询    (2)SQL99标准的连接查询   (3)子查询     (4)分级查询 oracle多表查询有两种方式,一种是oracle所 ...