import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import org.apache.commons.lang3.time.DateUtils; public class calendarTest {
// Calendar的作用:设置日期时间、对日历字段进行加减操作,获得日历字段的详细信息
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance();
// TODO get方法 返回给定日历字段的值。
// 获取当前年份
int year = cal.get(Calendar.YEAR); // 获取当前月份 Calendar.MONTH从0开始
int month = (cal.get(Calendar.MONTH)) + 1; // 获取当前天是当前月的第几天:即当前日期
int day_of_month = cal.get(Calendar.DAY_OF_MONTH);
// Calendar.DAY_OF_MONTH 和 Calendar.DATE 是等价的
int date = cal.get(Calendar.DATE); // 获取当前小时数:HOUR_OF_DAY-24小时制
int hour24 = cal.get(Calendar.HOUR_OF_DAY);
// HOUR-12小时制
int hour12 = cal.get(Calendar.HOUR); // 获取当前分钟数
int minute = cal.get(Calendar.MINUTE); // 获取当期秒数
int second = cal.get(Calendar.SECOND); // 获取当前天是当前自然周的第几天 Calendar.DAY_OF_WEEK用数字(1~7)表示(星期日~星期六)
int day_of_week = cal.get(Calendar.DAY_OF_WEEK); // 0-上午;1-下午
int ampm = cal.get(Calendar.AM_PM); // 获取当前日期所在的自然周是当前年的第几个自然周
int week_of_year = cal.get(Calendar.WEEK_OF_YEAR); // 获取当前日期所在的自然周是当前月的第几个自然周
int week_of_month = cal.get(Calendar.WEEK_OF_MONTH); // 获取当前日期所在的非自然周是当前月中的第几个非自然周 (1-7第一周)
int day_of_week_in_month = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 获取当前日期是当前年的第几天
int day_of_year = cal.get(Calendar.DAY_OF_YEAR); // 获取一个自然周的第一天是星期几;目前默认的一周的第一天是周天。
int FirstDayOfWeek = cal.getFirstDayOfWeek(); // 返回指定日历字段实际拥有的最大值。
// month:11;day_of_month:28,29,30,31;day_of_year:365,366
int ActualMaximum = cal.getActualMaximum(Calendar.DAY_OF_YEAR); // 返回指定日历字段拥有的最大值。
// month:11;day_of_month:31;day_of_year:366
int Maximum = cal.getMaximum(Calendar.DAY_OF_YEAR); // 返回指定日历字段实际拥有的最小值。
// year:1;month:0;day_of_month:1;day_of_year:1;week_of_year:1
int ActualMinimum = cal.getActualMinimum(Calendar.DAY_OF_YEAR); // 返回指定日历字段拥有的最小值。
// year:1;month:0;day_of_month:1;day_of_year:1;week_of_year:1
int Minimum = cal.getMinimum(Calendar.DAY_OF_YEAR); // Calendar转Date
Date date1 = cal.getTime(); // Date转Calendar
cal.setTime(date1);
cal.set(Calendar.YEAR, 2016);
Calendar cal1 = Calendar.getInstance();
System.out.println("1111111:" + cal);
System.out.println(cal.getTime());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(cal1.getTime());
System.out.println("22222222:" + cal1);
// TODO set方法
// 将给定的日历字段设置为给定值(定位),在使用set方法之前,建议先clear()一下,否则很多信息会继承自系统当前时间
// 注意事项:如果set()的日期不合法,就会往后找,自动转换为合法的日期
// 如set 2017-09-31,9月没有31,就会往后找,找一天,实际日期应该为2017-10-1
System.out.println(cal.getTime());
cal.clear();
System.out.println(cal.getTime());
cal.set(2017, Calendar.SEPTEMBER, 30);
System.out.println("合法日期2017-9-30 :" + sdf.format(cal.getTime()));
cal.set(2017, Calendar.SEPTEMBER, 31);
System.out.println("2017-9-31设置为合法日期:" + sdf.format(cal.getTime())); // 得到今年的实际最大的星期数
int weeks = cal.getActualMaximum(Calendar.WEEK_OF_YEAR);
System.out.println("今年的实际星期数:" + weeks);
// 设置一个不合法的星期数
cal.set(Calendar.WEEK_OF_YEAR, 60);
System.out.println("往后找到" + cal.get(Calendar.YEAR) + "年的第" + cal.get(Calendar.WEEK_OF_YEAR) + "周"); // TODO add方法 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
// add()有两条规则:
// 1.当被修改的字段超过它可以的范围时,那么比它大的字段会自动修正。
// 2.如果比它小的字段在修正后的日期内是合法的,则小字段不需要改变;否则小字段会修正到变化最小的合法值。
// 例1 8
cal.set(2017, Calendar.AUGUST, 31);
// 规则1:没有超过范围,不用改变大的字段(年份不变)
cal.add(Calendar.MONTH, 1);
// 规则2:比其小的字段不合法(日期改变),修正到变化最小的值,为30即可
System.out.println("add方法规则:" + sdf.format(cal.getTime()));// 结果是2017-09-30 // 例2
cal.set(2017, Calendar.AUGUST, 31);
// 规则1:超过范围,改变大的字段(年份不变)(年份改为2018)
// 规则2:比其小的字段不合法(日期改变),变化最小值,为30即可
cal.add(Calendar.MONTH, 13);
System.out.println("add方法规则:" + sdf.format(cal.getTime()));// 结果是2018-09-30 // TODO roll方法 和add方法一样,区别就是 当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正
// 1.当被修改的字段超过它可以的范围时,那么比它大的字段不会自动修正。
// 2.如果比它小的字段在修正后的日期内是合法的,则小字段不需要改变;否则小字段会修正到变化最小的合法值。
// 例1
cal.set(2017, Calendar.AUGUST, 31);
cal.roll(Calendar.MONTH, 13);
System.out.println("roll方法规则:" + sdf.format(cal.getTime()));// 结果是2017-09-30 // 求某月的第一天和最后一天
cal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("月中的第一天:" + sdf.format(cal.getTime()));
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println("月中的最后一天:" + sdf.format(cal.getTime())); // 求上月的最后一天
cal.add(Calendar.MONTH, -1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println("上月的最后一天:" + sdf.format(cal.getTime())); // 求两个日期间的时间差()
Calendar c1 = Calendar.getInstance();
c1.clear();
c1.set(2017, Calendar.SEPTEMBER, 20, 15, 52, 35);
Calendar c2 = Calendar.getInstance();
c2.clear();
c2.set(2017, Calendar.SEPTEMBER, 26, 14, 52, 35); long l1 = c1.getTimeInMillis();
long l2 = c2.getTimeInMillis();
long l3 = (l2 - l1) / 1000 / 60 / 60 / 24;// 天数
long l4 = (l2 - l1) / 1000 / 60 / 60 % 24;// 小时
long l5 = (l2 - l1) / 1000 / 60 % 60;// 分
long l6 = (l2 - l1) / 1000 % 60;// 秒
System.out.println("时间相差" + l3 + "天" + l4 + "小时" + l5 + "分" + l6 + "秒"); // 求n天之后的日期
c2 = Calendar.getInstance();
c2.add(Calendar.DATE, 4);
System.out.println("n天之后的日期:" + sdf.format(c2.getTime())); // 计算某一天是一年中的第几个星期
String s = "2018-1-7";
Date dd = DateUtils.parseDate(s, "yyyy-MM-dd");
c2.setTime(dd);
System.out.println("当年的第" + c2.get(Calendar.WEEK_OF_YEAR) + "周"); // 计算一年中第几周的星期几是几号
c2 = Calendar.getInstance();
System.out.println(c2.get(Calendar.WEEK_OF_YEAR));
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.WEEK_OF_YEAR, c2.get(Calendar.WEEK_OF_YEAR));
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("今天是" + cal.get(Calendar.DAY_OF_MONTH) + "号"); // TODO 毫秒的3种获取方式
System.currentTimeMillis();
Calendar.getInstance().getTimeInMillis();
new Date().getTime(); // 性能比较
long times = 10000000l;
long t1 = System.currentTimeMillis();
testSystem(times);
long t2 = System.currentTimeMillis();
System.out.println("system耗时:" + (t2 - t1));
testCalendar(times);
long t3 = System.currentTimeMillis();
System.out.println("Calendar耗时:" + (t3 - t2));
testDate(times);
long t4 = System.currentTimeMillis();
System.out.println("Date耗时:" + (t4 - t3));
// 结果发现System.currentTimeMillis()和new
// Date().getTime()获取的速度差不多;Calendar.getInstance().getTimeInMillis()
// 这种方式速度最慢,看源码会发现,Canlendar因为要处理时区问题会耗费很多的时间。所以建议多使用第一种方式或第二种。 // TODO 纳秒的作用
// java中System.nanoTime()返回的是纳秒,但是不能用它来计算当前日期.
// 此返回值表示从某一固定但任意的时间算起的纳秒数(或许从以后算起,所以该值可能为负)。
// nanoTime主要的用途是衡量一个时间段,比如说一段代码执行所用的时间,获取数据库连接所用的时间,网络访问所用的时间等。 // TODO java.util.Date和java.sql时间类的区别及应用
// java.util.Date 是 java.sql.Date 的父类,前者是常用的表示时间的类,后者在读写数据库的时候用。
// java.sql包下给出三个与数据库相关的日期时间类型,分别是:
// Date:表示日期,只有年月日,没有时分秒。会丢失时间;
// Time:表示时间,只有时分秒,没有年月日。会丢失日期;
// Timestamp:表示时间戳,有年月日时分秒,以及毫秒。
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
System.out.println(sqlDate);// 2017-09-26 java.sql.Time sqlTime = new java.sql.Time(System.currentTimeMillis());
System.out.println(sqlTime);// 16:10:43 java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
System.out.println(sqlTimestamp);// 2017-09-26 16:10:43.043 // 相互转换
// 把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用。
java.util.Date d1 = sqlDate;
java.util.Date d2 = sqlTime;
java.util.Date d3 = sqlTimestamp; // 当需要把java.util.Date转换成数据库的三种时间类型时,这就不能直接赋值了,这需要使用数据库三种时间类型的构造器。
// java.sql包下的Date、Time、TimeStamp三个类的构造器都需要一个long类型的参数,表示毫秒值(时间戳)。
// 创建这三个类型的对象,只需要有毫秒值即可。我们知道java.util.Date有getTime()方法可以获取毫秒值,那么这个转换也就不是什么问题了。
java.util.Date d = new java.util.Date();
java.sql.Date d4 = new java.sql.Date(d.getTime());// 会丢失时分秒
java.sql.Time d5 = new java.sql.Time(d.getTime());// 会丢失年月日
java.sql.Timestamp d6 = new java.sql.Timestamp(d.getTime()); // TODO 两个new Date()对象的hasCode()值一样的原因。
// 是因为Date类重写了生成hashCode的方法。以对象当前的毫秒值为基础生成。因此,如果在同一时间做new
// Date()操作,两次new的时间差小于1毫秒,所以两者的毫秒值是一样的,那么在这个运算下生成的hashCode就是相等。
System.out.println("***********" + System.currentTimeMillis());
Date d7 = new Date();
// try {
// new Thread();
// Thread.sleep(1);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
Date d8 = new Date();
System.out.println("***********" + System.currentTimeMillis());
System.out.println("d7的hascode:" + d7.hashCode());
System.out.println("d7的hascode:" + d8.hashCode());
} public static void testSystem(long times) {
for (int i = 0; i < times; i++) {
System.currentTimeMillis();
}
} public static void testCalendar(long times) {
for (int i = 0; i < times; i++) {
Calendar.getInstance().getTimeInMillis();
}
} public static void testDate(long times) {
for (int i = 0; i < times; i++) {
new Date().getTime();
}
} }

Java Calendar使用的更多相关文章

  1. Java Calendar 类的时间操作

    Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...

  2. Java Calendar获取年、月、日、时间

    Java Calendar获取年.月.日.时间 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00" ...

  3. Java Calendar类使用总结

    平时在浏览一些网站时,有些网站会显示出当前时间,如现在是xx年xx月xx日 xx时xx分xx秒,在实际的开发过程中,也会涉及到日期和时间的计算,Java中提供了一个专门的类Calendar来处理日期与 ...

  4. Java Calendar使用总结

    JavaCalendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/a ...

  5. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(1) Calendar

    Java 操作日期/时间,往往会涉及到Calendar,Date,DateFormat这些类. 最近决定把这些内容系统的整理一下,这样以后使用的时候,会更得心应手.本章的内容是主要讲解“Java时间框 ...

  6. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口

    本章主要是收藏一些常用的类和接口,包括:万年历(农历.阳历节日.阴历节日).自定义的Calendar接口. 万年历 源码如下(ChineseCalendar.java): package com.vi ...

  7. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(3) Date

    本章主要介绍Date类,并通过示例学习如何使用它.最后,讲解一下UTC.GMT和时区的关系. Date 介绍 Date 定义 public class Date implements java.io. ...

  8. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(4) DateFormat

    本章主要介绍DateFormat. DateFormat 介绍 DateFormat 的作用是 格式化并解析“日期/时间”.实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date ...

  9. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(5) SimpleDateFormat

    本章介绍SimpleDateFormat. SimpleDateFormat 介绍 SimpleDateFormat 是一个格式化Date 以及 解析日期字符串 的工具.它的最常用途是,能够按照指定的 ...

  10. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(6) Locale

    本章介绍Locale. 1 Locale 介绍 Locale 表示地区.每一个Locale对象都代表了一个特定的地理.政治和文化地区. 在操作 Date, Calendar等表示日期/时间的对象时,经 ...

随机推荐

  1. APIView源码与Request源码分析

    一.APIView源码分析 1.安装djangorestframework 2.使用 drf是基于cbv view的封装,所以必须写cbv ①第一步:写视图,必须写cbv 路由配置: from res ...

  2. [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...

  3. JS框架_(JQuery.js)网页文字评论弹幕

    百度云盘 传送门 密码:3azl jQuery网页右下角文字评论弹幕效果 <!DOCTYPE html> <html> <head> <title>jQ ...

  4. JS框架_(JQbar.js)柱状图动态百分比进度条特效

    百度云盘 传送门 密码:q6rt 柱状图动态百分比进度条效果 <html> <head> <title>jqbar.js柱状图动态百分比进度条特效</titl ...

  5. [CSP-S模拟测试]:组合(欧拉路)

    题目传送门(内部题119) 输入格式 第一行,三个整数$T,M,N$. 接下来的$N$行,每行两个整数$u_i,v_i$($i$从$1$开始编号).允许$u_i=v_i$,也允许同样的简单词多次出现. ...

  6. java 调用腾讯云短信api

    依赖: <!--腾讯短信依赖--> <dependency> <groupId>com.github.qcloudsms</groupId> <a ...

  7. 两个html之间进行传值,如何进行?

    function turnto(){ var getval=document.getElementById("text").value; turngetval=escape(get ...

  8. mysql 查询每个分组的前几名

    按分组排序,并查出每个分组的前3名 单表 SELECT * FROM ( SELECT ZONEID, uid, NAME, fight, IF ( , ) AS rank, ( @zone := z ...

  9. 通过实例聊聊Java中的多态

    Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();  那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...

  10. day3_Python基础三

    参考:http://www.cnblogs.com/jin-xin/articles/7562422.html 一.数据类型 1.1.int:用于计算,不可变,可哈希 数字主要是用于计算用的: #bi ...