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. 初探Lambda表达式/Java多核编程【1】从集合到流

    从集合到流 接上一小节初探Lambda表达式/Java多核编程[0]从外部迭代到内部迭代,本小节将着手使用"流"这一概念进行"迭代"操作. 首先何为" ...

  2. wcf ServiceContract

    ServiceContract是什么 ServiceContract怎么用

  3. C语言 extern学习1

    没有头文件时,通过本文件内的函数声明来确定定义域,实现功能: //单文件测试 #include <stdio.h> /* 经测试,C语言环境下子函数默认是void型:所以可省略不写 为严谨 ...

  4. 使用node-inspector调试nodejs程序<nodejs>

    1.npm install -g node-inspector  // -g 导入安装路径到环境变量 一般是c盘下AppData目录下 2.node-inspector & //启动node- ...

  5. 【异构计算】在Windows下使用OpenCL配置

    前言 目前,NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL(NVIDIA 的正式版 driver 是从自195.62 版开始,而 AMD则是从9.11 版开始).NV ...

  6. 通过映射关系 动态转义为统一格式的数据 (支持 JSON 和 XML )

    在很多的时候 我们都会 需要 将不同格式的数据  转换为 统一的数据格式 比如 将Json 源数据 { "b": [ { "c": "referenc ...

  7. jQuery_第四章_思维图

    ---------------------------------------------------------------------------------------------------- ...

  8. esri-leaflet入门教程(5)- 动态要素加载

    esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...

  9. git的安装和环境配置过程(学习笔记)

    1.安装git 官网下载:https://github.com(目前官网好像找不到了,但是妙味的视频里面是在官网下载的)https://git-for-windows.github.io/ (廖雪峰老 ...

  10. java第二天

    while循环 基本格式: int sum=0: int i =0:初始化循环变量值 while(i<10循环条件){ 循环变量变化的过程 i++: 循环体 sum+=i; System.out ...