第二十三章 时间操作类
提纲
- 23.1 Date类
- 23.1.1 什么是Date类
- 23.1.2 构造方法
- 23.1.3 常用方法
- 23.2 Calendar类
- 23.2.1 什么是Calendar类
- 23.2.2 常用字段
- 23.2.3 常用方法
- 23.3 时间格式化类
- 23.4 作业
23.1 Date类
- 23.1.1 什么是Date类:java.util.Date类,在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。
- 所有月份:一月:January,二月February,三月March,四月April,五月May,六月June,七月July,八月August,九月September,十月October,十一月November,十二月December。
- 所有星期:星期一Monday,星期二Tuesday,星期三Wednesday,星期四Thursday,星期五Friday,星期六Saturday,星期日Sunday。
- 工作日weekday。
- 23.1.2 构造方法
-
Date():使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象。
Date d = new Date(); System.out.println(d); //执行结果 Sun Mar 08 16:35:58 CST 2009
结论:在该格式中,Sun代表Sunday(周日),Mar代表March(三月),08代表8号,CST代表China Standard Time(中国标准时间,也就是北京时间(东八区))。
-
Date(int year, int month, int date):Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1以后的值。
Date d = new Date(2009-1900,3-1,9); System.out.println(d); //执行结果 Mon Mar 09 00:00:00 CST 2009
注意:Date类中,年份减去1900,月份为0-11,所以输入的实际月份要减去1。
-
Date(long date):传递一个毫秒数,获取这个毫秒数所对应的当前时间。
-
- 23.1.3 常用方法
-
getYear():年份,得到的年份是減去了1900的,所以最后的结果必须加上1900。
-
getMonth():月份,Java中月份是0-11,所以得到的月份必须加上1才等于实际月份。
-
getDate():日期
-
getHours():小时
-
getMinutes():分钟
-
getSeconds():秒
-
getDay():星期,0 = Sunday(日), 1 = Monday(一), 2 = Tuesday(二), 3 = Wednesday(三), 4 = Thursday(四), 5 = Friday(五), 6 = Saturday(六)。
public static void main(String[] args) { Date d2 = new Date(); //年份 int year = d2.getYear() + 1900; //月份 int month = d2.getMonth() + 1; //日期 int date = d2.getDate(); //小时 int hour = d2.getHours(); //分钟 int minute = d2.getMinutes(); //秒 int second = d2.getSeconds(); //星期几,0-6 int day = d2.getDay(); System.out.println("年份:" + year); System.out.println("月份:" + month); System.out.println("日期:" + date); System.out.println("小时:" + hour); System.out.println("分钟:" + minute); System.out.println("秒:" + second); System.out.println("星期:" + day); } //执行结果 年份:2017 月份:10 日期:14 小时:23 分钟:24 秒:32 星期:6
-
getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 到目前的毫秒数。
Date d3 = new Date(2009-1900,3-1,10); //将Date类的对象转换为相对时间 long t = d3.getTime(); System.out.println(t); //将相对时间转换为Date类的对象 long time = 1290876532190L; Date d4 = new Date(time); System.out.println(d4); //执行结果 1236614400000 Sun Nov 28 00:48:52 CST 2010
-
23.2 Calendar类
- 23.2.1 什么是Calendar类:java.util.Calendar类,从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
- 23.2.2 常用字段(一般用作方法中field参数)
- Calendar.YEAR——年份
- Calendar.MONTH——月份。与Date类相同,为0-11。
- Calendar.DATE——日期
- Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
- Calendar.HOUR——12小时制的小时数
- Calendar.HOUR_OF_DAY——24小时制的小时数
- Calendar.MINUTE——分钟
- Calendar.SECOND——秒
- Calendar.DAY_OF_WEEK——星期几。在Calendar类中,星期是1-7,周日是1,周一是2,周二是3,依次类推。。
- 23.2.3 常用方法
-
getInstance():由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
//直接打印Calendar对象打印结果 java.util.GregorianCalendar [time=1507996061941,areFieldsSet=true,areAllFieldsSet=true,lenient=true, zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000, dstSavings=0,useDaylight=false,transitions=19,lastRule=null], firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2017,MONTH=9,WEEK_OF_YEAR=41, WEEK_OF_MONTH=2,DAY_OF_MONTH=14,DAY_OF_YEAR=287,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=2, AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=47,SECOND=41, MILLISECOND=941,ZONE_OFFSET=28800000,DST_OFFSET=0]
-
public final void set(int year,int month,int date):设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。
-
set(int year, int month, int date, int hourOfDay, int minute):设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
-
set(int year, int month, int date, int hourOfDay, int minute, int second):设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
-
set(int field, int value):将给定的日历字段设置为给定值。
-
public int get(int field):返回给定日历字段的值。其中参数field代表需要获得的字段的值,字段说明和上面的set方法保持一致。
//举例:设置时间与获得Calendar类中的信息 Calendar c2 = Calendar.getInstance(); //设置时间方法1:直接调用上述2、3、4中方法填写。 //方法2:调用5中的set(int field, int value)方法 c2.set(Calendar.YEAR, 1996); c2.set(Calendar.MONTH, 10-1); c2.set(Calendar.DAY_OF_MONTH, 28); c2.set(Calendar.HOUR, 1); c2.set(Calendar.MINUTE, 2); c2.set(Calendar.SECOND, 50); //获取信息 //年份 int year = c2.get(Calendar.YEAR); //月份 int month = c2.get(Calendar.MONTH) + 1; //日期 int date = c2.get(Calendar.DATE); //小时 int hour = c2.get(Calendar.HOUR_OF_DAY); //分钟 int minute = c2.get(Calendar.MINUTE); //秒 int second = c2.get(Calendar.SECOND); //星期几,1-7,星期要减去一,变成0-6 int day = c2.get(Calendar.DAY_OF_WEEK) - 1; System.out.println("年份:" + year); System.out.println("月份:" + month); System.out.println("日期:" + date); System.out.println("小时:" + hour); System.out.println("分钟:" + minute); System.out.println("秒:" + second); System.out.println("星期:" + day); //执行结果 年份:1996 月份:10 日期:28 小时:1 分钟:2 秒:50 星期:2
-
public abstract void add(int field,int amount):该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少时amount的值为负。
Calendar c3 = Calendar.getInstance(); c3.add(Calendar.DATE, 100); int year1 = c3.get(Calendar.YEAR); //月份 int month1 = c3.get(Calendar.MONTH) + 1; //日期 int date1 = c3.get(Calendar.DATE); System.out.println(year1 + "年" + month1 + "月" + date1 + "日"); //执行结果 2018年1月23日
结果解释:这里add方法是指在c3对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的日期
-
public boolean after(Object when):该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。
Calendar c4 = Calendar.getInstance(); c4.set(2009, 10 - 1, 10); Calendar c5 = Calendar.getInstance(); c5.set(2010, 10 - 1, 10); boolean b = c5.after(c4); System.out.println(b); //执行结果 true
结果解释:在该示例代码中对象c4代表的时间是2009年10月10号,对象c5代表的时间是2010年10月10号,则对象c5代表的日期在c4代表的日期之后,所以after方法的返回值是true。
-
public boolean before(Object when):该方法是判断当前日期对象是否位于另外一个日期对象之前。
-
public final Date getTime():该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。
-
public final void setTime(Date date):该方法的作用是将Date对象转换为对应的Calendar对象
//举例1:Date与Calendar对象之间的转换 Date d = new Date(); Calendar c6 = Calendar.getInstance(); //Calendar类型的对象转换为Date对象 Date d1 = c6.getTime(); //Date类型的对象转换为Calendar对象 Calendar c7 = Calendar.getInstance(); c7.setTime(d); //举例2:Calendar对象和相对时间之间的互转 Calendar c8 = Calendar.getInstance(); long t = 1252785271098L; //将Calendar对象转换为相对时间 long t1 = c8.getTimeInMillis(); //将相对时间转换为Calendar对象 Calendar c9 = Calendar.getInstance(); c9.setTimeInMillis(t1);
解释:在转换时,使用Calendar类中的getTimeInMillis方法可以将Calendar对象转换为相对时间。在将相对时间转换为Calendar对象时,首先创建一个Calendar对象,然后再使用Calendar类的setTimeInMillis方法设置时间即可。
-
23.3 时间格式化类
- 23.3.1 什么是时间格式化类:SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
- 23.3.2
23.4 作业
-
使用Date类求获取当前日期,分别使用下以下格式打印:
- 按日期的原格式打印.
- “当前时间是: xxxx年xx月xx日 星期X 北京时间”。
- “当前时间是: xxxx年xx月xx日 时:分:秒”。
- 按欧美日期习惯输出当前日期 (“月-日-年 时:分:秒”)。
-
使用Date的Date(int year, int month, int date) 构造方法,构造当前日期,打印输出.求出当前日期自1970年1月1日起的已经有多少天了.
-
使用Calendar类,编写程序求出你的出生的那一天是星期几.并求出你出生到今天一共有多少天,打印输出.
-
使用Calendar类,由命令行输入年和月,打印该月的日历,按照Windows系统中日历格式。该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。(该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。)
-
计算两个日期之间相差的天数:例如计算2010年4月1号和2009年3月11号之间相差的天数,则可以使用时间和日期处理进行计算。(该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。)
-
使用Calendar类实现如下效果:(计算任意两个时间差,用以下几种方法来表示。例如:2010年8月18日到今天的时间。)
两个时间相差:2671天9时55分26秒 按天计算相差:2671.413495613426天 按时计算相差:64113.923894722226时 按分计算相差:3846835分 按秒计算相差:230810126秒