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. 玩转 Ceph 的正确姿势

    玩转 Ceph 的正确姿势 本文先介绍 Ceph, 然后会聊到一些正确使用 Ceph 的姿势:在集群规模小的时候,Ceph 怎么玩都没问题:但集群大了(到PB级别),这些准则可是保证集群健康运行的不二 ...

  2. Tomcat使用常见问题

    1,启动服务器,闪退问题 原因:tomcat软件是用java语言开发的,软件启动时,会默认到系统环境变量中查找一个名叫JAVA_HOME的变量.这个变量的作用是找到tomcat启动所需的JVM.   ...

  3. [TensorFlow] Basic Usage

    Install TensorFlow on mac Install pip # Mac OS X $ sudo easy_install pip $ sudo easy_install --upgra ...

  4. 内功心法 -- java.util.ArrayList<E> (5)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  5. sonarqube+Scanner代码质量管理工具

    本文相关描述基于sonarqube 6.2版本. 下载地址: sonarqube下载网址:https://www.sonarqube.org/downloads/ Scanner下载网址(用于扫描项目 ...

  6. 关于C++的const对象

    对于const类对象,类指针, 类引用, 只能调用类的const成员函数. 1.const成员函数不允许被修改它所在对象的任何一个成员变量. 2.const成员函数能访问对象的const成员, 而其他 ...

  7. FMDB的简单用法

    使用cocoaPods将FMDB下载到工程 第一步:引入框架,引入支持类库(libsqlite3.0.tbd) #import <FMDB.h> 声明属性 @interface ViewC ...

  8. excel中VBA的使用

    遇到的问题 在工作中遇到了一点小小的问题,需要给我负责带的班级的同学们测试男生1000米,女生800米的成绩.表格是这样的: 体育成绩表 序号 班级 姓名 性别 男1000.女800 成绩 1 1 张 ...

  9. 封装keyframes插件

    模仿jquery,使用简单,自动添加浏览器前缀 var keyframes = new SHBKerframes(); keyframes.define([{ name:'myAnimate', 0% ...

  10. CSS Flexbox 学习指南、工具与框架

    Flexbox 是一种更有效的布局方式,它能更好的分配容器空间,并控制项目的对齐.虽然,掌握它的理论有些复杂,但幸运的是,我们可以借助开放的网络来学习并逐步掌握它. 在本文中,我们整合了一些最佳的 F ...