第二十三章_时间操作类

第二十三章 时间操作类


提纲

  • 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类进行时间和日期处理。
    1. 所有月份:一月:January,二月February,三月March,四月April,五月May,六月June,七月July,八月August,九月September,十月October,十一月November,十二月December。
    2. 所有星期:星期一Monday,星期二Tuesday,星期三Wednesday,星期四Thursday,星期五Friday,星期六Saturday,星期日Sunday。
    3. 工作日weekday。
  • 23.1.2 构造方法
    1. 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(中国标准时间,也就是北京时间(东八区))。

    2. 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。

    3. Date(long date):传递一个毫秒数,获取这个毫秒数所对应的当前时间。

  • 23.1.3 常用方法
    1. getYear():年份,得到的年份是減去了1900的,所以最后的结果必须加上1900。

    2. getMonth():月份,Java中月份是0-11,所以得到的月份必须加上1才等于实际月份。

    3. getDate():日期

    4. getHours():小时

    5. getMinutes():分钟

    6. getSeconds():秒

    7. 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
      
    8. 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参数)
    1. Calendar.YEAR——年份
    2. Calendar.MONTH——月份。与Date类相同,为0-11。
    3. Calendar.DATE——日期
    4. Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
    5. Calendar.HOUR——12小时制的小时数
    6. Calendar.HOUR_OF_DAY——24小时制的小时数
    7. Calendar.MINUTE——分钟
    8. Calendar.SECOND——秒
    9. Calendar.DAY_OF_WEEK——星期几。在Calendar类中,星期是1-7,周日是1,周一是2,周二是3,依次类推。。
  • 23.2.3 常用方法
    1. 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]
      
    2. public final void set(int year,int month,int date):设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。

    3. set(int year, int month, int date, int hourOfDay, int minute):设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。

    4. set(int year, int month, int date, int hourOfDay, int minute, int second):设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。

    5. set(int field, int value):将给定的日历字段设置为给定值。

    6. 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
      
    7. 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天以后的日期

    8. 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。

    9. public boolean before(Object when):该方法是判断当前日期对象是否位于另外一个日期对象之前。

    10. public final Date getTime():该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。

    11. 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 作业

  1. 使用Date类求获取当前日期,分别使用下以下格式打印:

    1. 按日期的原格式打印.
    2. “当前时间是: xxxx年xx月xx日 星期X 北京时间”。
    3. “当前时间是: xxxx年xx月xx日 时:分:秒”。
    4. 按欧美日期习惯输出当前日期 (“月-日-年 时:分:秒”)。
  2. 使用Date的Date(int year, int month, int date) 构造方法,构造当前日期,打印输出.求出当前日期自1970年1月1日起的已经有多少天了.

  3. 使用Calendar类,编写程序求出你的出生的那一天是星期几.并求出你出生到今天一共有多少天,打印输出.

  4. 使用Calendar类,由命令行输入年和月,打印该月的日历,按照Windows系统中日历格式。该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。(该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。)

  5. 计算两个日期之间相差的天数:例如计算2010年4月1号和2009年3月11号之间相差的天数,则可以使用时间和日期处理进行计算。(该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。)

  6. 使用Calendar类实现如下效果:(计算任意两个时间差,用以下几种方法来表示。例如:2010年8月18日到今天的时间。)

     两个时间相差:2671天9时55分26秒
     按天计算相差:2671.413495613426天
     按时计算相差:64113.923894722226时
     按分计算相差:3846835分
     按秒计算相差:230810126秒
    
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值