Java中Date,Calendar,GregorianCalenda

来源:互联网 发布:php租房网站源码 编辑:程序博客网 时间:2024/05/19 06:16

本文中提到的内容:

1.具体类(相对于抽象类)java.util.Date

2.java.util.Calendar抽象类及其子类java.util.GregorianCalendar

Date类:

在 JDK 1.1 之前,类Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化,比如规定了周日为一天中的第0天,月份也是从0开始,而年份更是减去了1990后的值。从 JDK 1.1 开始,应该使用Calendar 类实现日期和时间字段之间转换,使用DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。

当然,Date获取当前的日期和时间很简单,使用Date对象的toString方法打印当前日期和时间:Date date = new Date();System.out.println(date.toString());

常用Date方法:

getTime()  ---- 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此Date 对象表示的毫秒数。  //其他get方法,从JDK1.1开始由Calendar代替;

after()         ---- 测试此日期是否在指定日期之后;

        before        ---- 测试此日期是否在指定日期之前;

        equals       ---- 比较两个日期的相等性.


Calendar抽象类和GregorianCalendar子类:

JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用。

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

1、使用Calendar类代表当前时间

Calendar c = Calendar.getInstance();    //返回类型Calendar

Calendar c = new GregorianCalendar(); //返回类型GregorianCalendar

由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

注:我们从Calendar.getInstance() 中所获得的实例就是一个 "GreogrianCalendar" 对象(与您通过 new GregorianCalendar() 获得的结果一致),只不过返回类型不同。

使用该方法获得的Calendar对象就代表当前的系统时间,由于CalendartoString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。

另外,Calendar 与 Date 的转换非常简单:
    Calendar calendar = Calendar.getInstance();
    Date date = calendar.getTime();
    calendar.setTime(date);

2、使用Calendar类代表指定的时间

 Calendar c1 = Calendar.getInstance();
    c1.set(2009, 3 - 1, 9);
    使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
    set方法的声明为:
    public final void set(int year,int month,int date)
    以上示例代码设置的时间为2009年3月9日,其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值从0走到11,0是1月,11是12月份,如果设值最好使用如一月用Calendar.Jaunary表示,日期的值就是实际的日期值,星期是从1走到7,每周的第一天是周日而不是周一。这意味着1 = sunday, 2 = monday, …, 7 = Saturday。
    如果只设定某个字段,例如日期的值,则可以使用如下set方法:
    public void set(int field,int value)
    在该方法中,参数field代表要设置的字段的类型,常见类型如下:
    Calendar.YEAR——年份
    Calendar.MONTH——月份
    Calendar.DATE——日期
    Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
    Calendar.HOUR——12小时制的小时数
    Calendar.HOUR_OF_DAY——24小时制的小时数
    Calendar.MINUTE——分钟
    Calendar.SECOND——秒
    Calendar.DAY_OF_WEEK——星期几
    例如:
    c1.set(Calendar.DATE,10);
    该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。
3、获得Calendar类中的信息
    Calendar c2 = Calendar.getInstance();
    //年份
    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);
    //星期几
    int day = c2.get(Calendar.DAY_OF_WEEK);
    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);
   使用Calendar类中的get方法可以获得Calendar对象中对应的信息,get方法的声明如下:
   public int get(int field)
   其中参数field代表需要获得的字段的值,字段说明和上面的set方法保持一致。

4.其他常用方法

void add(int field,int count) ----- 根据日历的规则,为给定的日历字段添加或减去指定的时间量

例如,要从当前日历时间减去 5 天,可以通过调用以下方法做到这一点:

   add(Calendar.DAY_OF_MONTH, -5)。 

         --------------------------------------------------------

          boolean before(object when) ------ 判断此 Calendar 表示的时间是否在指定Object 表示的时间之前,返回判断结果。在 when 表示的时间之前,则返回true;否则返回false。(after方法原理同before)

---------------------------------------------------------

roll方法(两种):
  public abstract void roll(int field,boolean up)
  field :时间字段。
  up :指示指定时间字段的值是向上滚动还是向下滚动。如果向上滚动,则使用 true,否则使用 false。
  要将当前日期向上滚动一天,可以通过调用以下方法做到这一点:
  roll(Calendar.DATE, true)

  public void roll(int field,  int amount)
  field - 日历字段。
  amount - 要添加到日历 field 中的有符号时间量。
  含义:向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。负的时间量意味着向下滚动。
 

        下面通过例子解释第二中方法的使用及与add的区别和注意地方:

        // 2009-1-31
        Calendar c = Calendar.getInstance();
        c.set(2009, Calendar.JANUARY, 31);

        //或使用Calendar c =new GregorianCalendar(2009, Calendar.JANUARY, 31)创建
        c.add(Calendar.MONTH, 13); // 2010-2-28
        c.add(Calendar.MONTH, 1); // 2010-3-28
 
        // 2009-1-31
        c.set(2009, Calendar.JANUARY, 31);
        c.roll(Calendar.MONTH, 13); // 2009-2-28
        c.roll(Calendar.MONTH, 1); // 2009-3-28
        这两个方法都会自动调整单位小的值,如上例中DATE变成了28。 
        这两个方法都不会记住调整前的值,如上例中再增加1个月后DATE仍是28。
        add()方法会改变单位大的值,如上例中增加13个月后YEAR变成了2010;而roll()方法不会改变单位大的值,增加13个月后YEAR还是2009

   5.Calendar对象和相对时间之间的互转

          Calendar c_l= Calendar.getInstance();

         //Calendar对象转换为相对时间

         long t = c_l.getTimeInMillis();

        //将相对时间转换为Calendar对象

         Calendar l_c= Calendar.getInstance();

        l_c.setTimeInMillis(t);

     在程序中,某个固定的时间代表的都是一个时间点,也就是一个时间的瞬间,例如2009年3月8日15点50分0秒,在实际的应用中,经常需要对于两个时间进行比较或计算时间之间的差值,这些功能在Java语言中都可以很方便的实现。
   在Java语言中,时间的表达单位是毫秒。也就是说,Java语言中的时间处理可以精确到毫秒。
   在Java语言中,表达时间的方式有两种:
       a、绝对时间。以直观的形式来表达某个时间点,例如2009年10月10号0点0分0秒。使用这种形式表达时间,使用起来比较直观,但是不方便进行时间之间的计算。例如无法很直观的计算2020年1月1号0点0分0秒和上面这个时间之间相差多少天。绝对时间以对象的形式进行表达,Java API中提供了java.util包中的Date类和Calendar类的对象进行表达。

       b、相对时间。以一个long型的数字表达某个时间点。例如102847423468。使用这种方式的优缺点和绝对时间刚好相反。这种方式很方便时间之间的计算,但是阅读起来很不直观。在Java API中以需要表达的时间点,例如2009年10月10号0点0分0秒,和GMT(格林威治时间,也就是伦敦时间)1970年1月1号0点0分0秒之间相差的毫秒数作为相对时间的数值,如果该时间在这个时间只好,则相对时间为正数,否则相对时间为负数。Java API中提供了java.lang包中的System类的currentTimeMillis方法,获得以相对时间形式描述的当前系统时间。


0 0