Calendar类

历史上有许多纪年方法,其差异太大了。为了统一计时,通常采用格里高利日历。

1.创建Calendar对象

Calenda类是一个抽象类,所以不能使用构造器来创建Calendar对象。使用getInstance()方法来获取Calendar对象。这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone、Locale,则使用默认的TimeZone,Locale来创建Calendar。

    static void calenda2Date(){
//Calendar与Date的互相转换
//创建一个默认的Calendar对象
Calendar c1 = Calendar.getInstance();
//Calendar -> Date
Date date = c1.getTime();
//Date -> Calendar
Calendar c2 = Calendar.getInstance();
c2.setTime(date);
}

2.Calendar常用方法

  • void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。field是Calendar的类变量,如Calendar.YEAR, Calendar.MONTH, Calendar等。
  • int get(int field):返回指定日历字段的值。
  • int getActualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值是11.
  • int getActualMinimum(int field):返回指定日历字段可能拥有的最小值。流入月,最小值是0.
  • void roll(int field, int amount):与add()方法类似,区别在于加上amount后超出了该字段所能表示的最大范围时,也不会向上一个字段进位。
  • void set(int field, int value):将给定的日历字段设置为给定值。
  • void set(int year, int month, int date):设置Calendar对象的年、月、日的值。
  • void set(int year, int month, int data, int hourOfDay, int minute, int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值。
    static void calendarOperator(){
Calendar c1 = Calendar.getInstance();
System.out.println("系统时间:"+date2String(c1.getTime()));
c1.add(Calendar.MONTH,1);//月份+1
System.out.println("月份+1:"+date2String(c1.getTime()));
c1.roll(Calendar.MONTH,-2);//月份-2
System.out.println("减2个月"+date2String(c1.getTime()));
//Calendar中月的值是从0-11 System.out.println("Calendar中月份的最小值:"+c1.getActualMinimum(Calendar.MONTH));
System.out.println("Calendar中月份的最大值:"+c1.getActualMaximum(Calendar.MONTH));
System.out.println("Calendar中月份值:"+c1.get(Calendar.MONTH)+"\t实际月份:"+date2String(c1.getTime()).substring(5,7));
System.out.println("年:"+c1.get(Calendar.YEAR)+"\tCalendar月份:"+c1.get(Calendar.MONTH)+"日:"+c1.get(Calendar.DATE));
//set
c1.set(Calendar.MONTH,5);
System.out.println(date2String(c1.getTime()));
c1.set(2015,11,23);
System.out.println(c1.getTime());
c1.set(2014,11,30,14,22,35);
System.out.println(date2String(c1.getTime()));
}
static String date2String(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z");
return sdf.format(date);
}

3.add与roll的区别

add(int field, int amount)的规则:

  • 1.当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。
  • 2.如果下一级字段页需要改变,那么该字段会修正到变化最小的值
    static String date2String(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z");
return sdf.format(date);
}
static void addRoll(){
Calendar c1 = Calendar.getInstance();
System.out.println("超出范围,会影响上一级字段");
c1.set(2003,7,23,0,0,0);
String s1 = date2String(c1.getTime());
c1.add(Calendar.MONTH,6);
String s2 = date2String(c1.getTime());
System.out.println(s1+" 加上6个月->"+s2); System.out.println("超出范围,会影响下一级字段");
c1.set(2003,7,31,0,0,0);
String s3 = date2String(c1.getTime());
c1.add(Calendar.MONTH,6);
String s4 = date2String(c1.getTime());
System.out.println(s3+" 加上6个月->"+s4);
}


## 4.设置Calendar的容错性
setLenient()用于设置容错性,true开启,false关闭。
当传入一个不合法的参数,依然可以继续运行。如month范围0-11,设置为13
```#java
static void testLenient(){
Calendar c = Calendar.getInstance();
System.out.println("初始时间:"+date2String(c.getTime()));
//容错默认开启,将月份设置为13,13-11=2,年份+1,得到的Month index是2,value是1
c.set(Calendar.MONTH,13);
System.out.println("13-11,对应的MONTH值为1"+c.get(Calendar.MONTH));
System.out.println("月设置为13:"+date2String(c.getTime()));
//关闭容错性,将月份设置为13,提示Exception in thread "main" java.lang.IllegalArgumentException: MONTH
c.setLenient(false);
c.set(Calendar.MONTH,13);
System.out.println(date2String(c.getTime()));;
}
```

5.set()方法延迟修改

调用set()修改日历字段,Calendar代表的时间不会立即修改,直到下次调用get(), getTime(), getTimeInMillis(), add(), roll()才会重新计算日历的时间。

采用延迟修改的优势是多次调用set()不会触发多次不必要的计算

    static void testSet(){
Calendar c1 = Calendar.getInstance();
c1.set(2003,7,31);
System.out.println("初始日期"+date2String(c1.getTime()));
System.out.println("将月份设置为8");//9月31日不存在,调整为10月1日
c1.set(Calendar.MONTH,8);
System.out.println(date2String(c1.getTime()));
System.out.println("将日期设置为5");
c1.set(Calendar.DATE,5);
System.out.println(date2String(c1.getTime())); Calendar c2 = Calendar.getInstance();
c2.set(2003,7,31);
System.out.println("初始日期"+date2String(c2.getTime()));
System.out.println("将月份设置为8");
c2.set(Calendar.MONTH,8);
System.out.println("将日期设置为5");
c2.set(Calendar.DATE,5);
System.out.println(date2String(c2.getTime()));
}

廖雪峰Java7处理日期和时间-2Data和Calendar-2Calendar的更多相关文章

  1. 廖雪峰Java7处理日期和时间-2Data和Calendar-1Date

    计算机中如何存储和表示日期和时间 Epoch Time:从1970年1月1日零点(格林威治时区/GMT+00:00)到现在经历的秒数,也叫timestamp, 例如: 秒级: * 北京 2016-11 ...

  2. 廖雪峰Java7处理日期和时间-4最佳实践-最佳实践

    jdk提供了2套新旧的API来处理日期和时间. java.util * Date * Calendar java.time(JDK>=1.8) * Localdate * LocalTime * ...

  3. 廖雪峰Java7处理日期和时间-3java.time的API-2ZonedDateTime

    ZonedDatetime = LocalDateTime + ZoneId ZonedDateTime:带时区的日期和时间 ZoneId:新的API定义的时区对象(取代几句的java.util.Ti ...

  4. 廖雪峰Java7处理日期和时间-3java.time的API-1LocalDateTime

    1.java.time提供了新的日期和时间API: LocalDate/LocalTime/LocalDateTime ZoneDateTime/ZoneId Instant Formatter 新A ...

  5. 廖雪峰Java7处理日期和时间-1概念-1日期和时间

    1.日期 日期是指某一天,如2016-11-20,2018-1-1 2.时间有2种: 不带日期的时间:14:23:54 带日期的时间:2017-1-1 20:21:23,唯一确定某个时刻 3.时区 时 ...

  6. java日期和时间Date、Calendar、SimpleDateFormat

    1       时间和日期 1.1      日期类Date和格式化SimpleDateFormat 日期使用过程中需要将日期Date对象转化为字符串,或者将字符串形式的日期转化为日期Date对象.可 ...

  7. Java 中的日期与时间

    Java 日期时间 标签 : Java基础 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含 ...

  8. 廖雪峰Python电子书总结

    函数 1.注意:函数的默认参数必须指向不可变对象 未修改前: def add_end(L=[]): L.append('END') return L 存在的问题:如果连续调用多次,会出现多个 'END ...

  9. git常用命令总结--廖雪峰老师Git教程命令总结

    学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般 ...

随机推荐

  1. centos7安装doxygen

    编译 编译过程参考官网:https://www.stack.nl/~dimitri/doxygen/download.html 编译过程: git clone https://github.com/d ...

  2. 高性能场景下,HashMap的优化使用建议

    1. HashMap 在JDK 7 与 JDK8 下的差别 顺便理一下HashMap.get(Object key)的几个关键步骤,作为后面讨论的基础. 1.1 获取key的HashCode并二次加工 ...

  3. AWK入门

    AWK类型    AWK:源于AT&T实验室的AWK    NAWK:AWK的升级版    GAWK:GNU AWK,兼容AWK和NAWK    程序结构    BEGIN语句块,可选     ...

  4. 特殊场景Sql优化

    一.大表的大数据量修改 问题: 1.大量的行级锁,长时间阻塞   2.主从延时,大批数据不一致 解决方法: 分批次修改 二.大表的表结构修改 问题:长时间锁表 解决方法: 1.从库修改,主从切换,主库 ...

  5. VS--------实用快捷键

    Ctrl + M + O : 折叠所有方法 Ctrl + Tab: 切换不同窗口 ------------------------------开发--------------------------- ...

  6. vue,在模块中动态添加dom节点,并监听

    在这里,onclick事件没有作用,因为它指向的是window,如果写为this.click页面显示为undefined, 我采用的是通过class绑定事件,但是会有一个问题,那就是当你渲染多个事件时 ...

  7. SVN 的搭建及使用(一)下载和搭建SVN服务器

    (本文是从博客园上的文章改编而来,其中有些关于版本问题的截图是直接引用原文的,与当前版本有可能不同) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和 ...

  8. leetcode题解 200. Number of Islands(其实就是一个深搜)

    题目: Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is s ...

  9. 剑指Offer 36. 两个链表的第一个公共结点 (链表)

    题目描述 输入两个链表,找出它们的第一个公共结点. 题目地址 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tp ...

  10. 【oracle入门】Oracle数据库11g企业版主要优点

    高可靠性.能够尽可能地放置服务器故障.站点故障和人为错误的发生. 高安全信息.可以利用行级安全性.细粒度审计.透明的数据加密和数据的全面会议确保数据安全和遵守法规. 更好的数据管理.轻松管理最大型数据 ...