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. Javaweb程序服务器部署

    话说从接触web后就想着写一个自己的站点然后别人都可以访问,这也是一个小目标吧,从之前在使用校园网的时候把自己的电脑当成服务器然后部署使用同学的电脑访问,现在想让所有人都可以访问,于是就花重金租了腾讯 ...

  2. Android几行代码实现实时监听微信聊天

    实现效果: 实时监听当前聊天页面的最新一条消息,如图:            实现原理: 同样是利用AccessibilityService辅助服务,关于这个服务类还不了解的同学可以先看下我上一篇关于 ...

  3. Kafka 0.10 KafkaConsumer流程简述

    ConsumerConfig.scala 储存Consumer的配置 按照我的理解,0.10的Kafka没有专门的SimpleConsumer,仍然是沿用0.8版本的. 1.从poll开始 消费的规则 ...

  4. Spring + Quartz配置实例

    Spring为创建Quartz的Scheduler.Trigger和JobDetail提供了便利的FactoryBean类,以便能够在Spring 容器中享受注入的好处.此外Spring还提供了一些便 ...

  5. 【Ionic+AngularJS 开发】之『个人日常管理』App(二)

    准备工作 资源 预装工具 安装bower npm install -g bower 安装ngCordova bower install ngCordova (*由于网络获取资源的原因,后面几次建项目后 ...

  6. java Socket(TCP)编程小项目

    package 服务器端相关操作; import java.io.Serializable; /* * 创建存储需要传输信息的对象,方便客户端向服务器端传送数据 */ public class Cli ...

  7. AngularJS自定义指令之可选参数replace

    replace是一个可选参数,如果设置了这个参数,值必须为true,因为默认值为false.默认值意味着模板会被当作子元素插入到调用此指令的元素内部: 如: <my-directive>& ...

  8. MASM32使用教程

    代码如果你在用汇编语言来开发windows下的程序的话,MASM32是很好的选择. (Masm32下载地址请用google搜索罢.) 工欲善其事,必先利其器. 本文主要针对masm32 v8来说明三点 ...

  9. Android游戏开发实践(1)之NDK与JNI开发04

    Android游戏开发实践(1)之NDK与JNI开发04 有了前面几篇NDK与JNI开发相关基础做铺垫,再来通过代码说明下这方面具体的操作以及一些重要的细节.那么,就继续NDK与JNI的学习总结. 作 ...

  10. Linux系统(四)负载均衡LVS集群之NAT模式

    序言 提到LVS,就从章文嵩博士开始吧,反正也不知道如何下笔来写这一篇.章大博士,读博时候创建这个lvs软件项目,但是他提倡开源精神,在用户的建议和反馈中,这个花了他两周时间开发的开源软件不断得到改建 ...