一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java日期时间 java.util.Calendar和GregorianCalendar分析

时间:2015-09-07 编辑:简简单单 来源:一聚教程网

Java的java.util.Calendar用于日期和时间的运算。无论任何时候,只要你有一些轻微操作(除了仅仅表示日期和时间)需要执行,那么就使用这个类。(原文:Whenever you have something slightly more advanced than just representing a date and time, this is the class to use。)


java.util.Calendar类是抽象的,意味着你不能对其进行实例化。这么设计的原因是这个世界有着多个日历存在。举个例子,阿拉伯日历使用了一个和大部分西方国家所使用的公历不同的年份作为它的第一年。


(译者注:关于现行公历,转载维基的一段内容如下:现行公历(拉丁语:Calendarium Gregorianum,又称格里历,又译国瑞历、额我略历、格列高利历、格里高利历),是由意大利医生兼哲学家阿洛伊修斯・里利乌斯改革儒略历制定的历法,由教皇格列高利十三世在1582年颁行。公历是阳历的一种,于1912年开始在中国正式采用,取代传统使用的中国历法农历,而中国传统历法是一种阴阳历,因而公历在中文中又称阳历、西历、新历。格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。)

实例化GregorianCalendar

Java中只携带了格里历的实现,那就是java.util.GregorianCalendar类,下面是一个你如何实例化GregorianCalendar的例子:

Calendar calendar = new GregorianCalendar();

一个新的GregorianCalendar有着被设置为当前时间点的日期和时间,表示这是由它所创建的。

获取年、月、日等

Calendar类有着一些成对的方法可以让你获取到年、月、日、小时、分钟、秒、毫秒和给定日期的时区。下面是一些如何获取的例子:

Calendar calendar = new GregorianCalendar();

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);

int hour       = calendar.get(Calendar.HOUR);        // 12 hour clock
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int minute     = calendar.get(Calendar.MINUTE);
int second     = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);


你还可以访问更多的字段,比如不常用的DAY_OF_WEEK_IN_MONTH和AM_PM。你可以查阅官方的JavaDoc了解这些字段的更多信息。


Calendar类有着对应的set方法,因此你也可以对这些字段进行设置。下面是它长啥样的例子:

Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 24); // christmas eve


添加和减少年、月、日等

你也可以在这些字段上添加值并使得Calendar实例准确地自行更新。看看下面的例子:

Calendar calendar = new GregorianCalendar();

//set date to last day of 2009
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 31); // new years eve

//add one day
calendar.add(Calendar.DAY_OF_MONTH, 1);

//date is now jan. 1st 2010
int year       = calendar.get(Calendar.YEAR);  // now 2010
int month      = calendar.get(Calendar.MONTH); // now 0 (Jan = 0)
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // now 1


当进行一些日期运算的时候,add方法是非常便利的。比如在一个给定的日期上添加或者减少年数、月数、天数、小时数等。
通过调用带有负值的add方法在这些字段上减少值,比如:

    calendar.add(Calendar.DAY_OF_MONTH, -1);
    
陷阱和误区

在Calendar类中有一些小陷阱,你应该知道这些陷阱从而避免不必要的伤脑经。我将会在接下来的章节讨论他们。

月份陷阱

Calendar类的MONTH字段并不像我们在其他地方写下日期般从1到12。取而代之的是月份从0走到11,0是1月,11是12月份。如果你不知道这个的话,它将会引发一点错误和随其而来的调试。


星期几误区

如你希望的那样,星期是从1走到7,但是每周的第一天是周六而不是周一。这意味着1 = sunday, 2 = monday, …, 7 = Saturday。这也时不时地让我感到有点烦恼。



Java Calendar 类的时间操作

Java Calendar 类时间操作,代码很简单。

演示了获取时间,日期时间的累加和累减。

package MyTest;
/*
 * 演示 Calendar 的一般操作
 */
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.Calendar;
public class Test
{
  public Test()
  {
  }
  public static void main(String[] args)
  {
    // 字符串转换日期格式
    // DateFormat fmtDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    // 得到日期格式对象
    // Date date = fmtDateTime.parse(strDateMake);
    // 完整显示日期时间
    String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
    System.out.println(str);
    // 创建 Calendar 对象
    Calendar calendar = Calendar.getInstance();
    // 初始化 Calendar 对象,但并不必要,除非需要重置时间
    calendar.setTime(new Date());
    // setTime 类似上面一行
    // Date date = new Date();
    // calendar.setTime(date);
    // 显示年份
    int year = calendar.get(Calendar.YEAR);
    System.out.println("YEAR is = " + String.valueOf(year));
    // 显示月份 (从0开始, 实际显示要加一)
    int MONTH = calendar.get(Calendar.MONTH);
    System.out.println("MONTH is = " + (MONTH + 1));
    // 今年的第 N 天
    int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
    System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);
    // 本月第 N 天
    int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
    System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));
    // 3小时以后
    calendar.add(Calendar.HOUR_OF_DAY, 3);
    int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
    System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);
    // 当前分钟数
    int MINUTE = calendar.get(Calendar.MINUTE);
    System.out.println("MINUTE = " + MINUTE);
    // 15 分钟以后
    calendar.add(Calendar.MINUTE, 15);
    MINUTE = calendar.get(Calendar.MINUTE);
    System.out.println("MINUTE + 15 = " + MINUTE);
    // 30分钟前
    calendar.add(Calendar.MINUTE, -30);
    MINUTE = calendar.get(Calendar.MINUTE);
    System.out.println("MINUTE - 30 = " + MINUTE);
    // 格式化显示
    str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
    System.out.println(str);
    // 重置 Calendar 显示当前时间
    calendar.setTime(new Date());
    str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
    System.out.println(str);
    // 创建一个 Calendar 用于比较时间
    Calendar calendarNew = Calendar.getInstance();
    // 设定为 5 小时以前,后者大,显示 -1
    calendarNew.add(Calendar.HOUR, -5);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
    // 设定7小时以后,前者大,显示 1
    calendarNew.add(Calendar.HOUR, +7);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
    // 退回 2 小时,时间相同,显示 0
    calendarNew.add(Calendar.HOUR, -2);
    System.out.println("时间比较:" + calendarNew.compareTo(calendar));
  }
}



Calendar日历类和GregorianCalendar公历类用法的一个小结

日历类 主要涉及两个类,一个就是抽象类 Calendar类,另一个是他的子类GregorianCalendar。


一、Calendar类。

    1,主要字段:

    YEAR(年份)                                            MONTH(月份从0开始)                          DATE(一月的某天)                                    HOUR(指示上午或下午的小时)                                

    HOUR_F_DAY(指示一天中的小时。)         DAY_OF_WEEK (一个星期中的某天)   DAY_OF_MONTH(一个月中的某天)    DAY_OF_YEAR(一年中的某天)     

     DAY_OF_WEEK _IN_MONTH(一个月中的第几个星期)                      WEEK_OF_MONTH  (指示当前月中的星期数)            WEEK_OF_YEAR(指示当前年中的星期数)
    2,得Calendar类对象。

    //通过 Calendar类的静态方法getInstance获得。

    Calendar  ca = Calendar.getInstance();


    3,主要方法

    void set(int field,int value)//field日历类的参数,比如YEAR   MONTH   DATE 等...

    void set(int year,int month,int date)//设置年月日。

    void set(int year, int month, int date, int hourOfDay, int minute)//设置年月日时分

    void set(int year, int month, int date, int hourOfDay, int minute, int second)//设置年月日时分秒

    void setTime(Date date);//使用给定的 Date 设置此 Calendar 的时间。

     

    int  get(int field)//返回给定日历字段的值。如:int month = acobj.get(Calendar.MONTH);

    Date getTime()//返回一个表示此 Calendar 时间值的 Date 对象。

    long getTimeInMillis()//返回从1970.1.1   00:00:00到该日历的毫秒数。

     

    void add(int field,amont);//根据日历的规则,为给定的日历字段添加或减去指定的时间量。可加减。如:caobj.add(Calendar.MONTH,1)下一个月。

二、GregorianCalendar类。

    1,获得该类对象

    Calendar ca = new GregorianCalendar()//默认当前的时刻。

    Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth)//初始具有指定年月日的公历类对象。

    Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth,int hourOfDay,int minute)初始具有指定年月日的公历类对象。

    Calendar ca = new GregorianCanlendar(int year,int month,int dayOfMonth,int hourOfDay,int minute,int second)//初始具有指定年月日的公历类对象。

    上边的都是获得默认的语言环境,和默认的时区 对象。


    2,用法

    用法主要继承去父类Calendar。

附一演示程序:

package Calendar;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarDemo {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //获得一个日历对象
        Calendar ca = Calendar.getInstance();
//        ca.setFirstDayOfWeek(Calendar.SATURDAY);
        disPlay(ca);
        
        
        
        //创建日历对象时间为2012.12.12.12,12,12
        Calendar c2 = new GregorianCalendar(2012, 11, 12, 12, 12, 12);
        disPlay(ca);
        
        
        //根据在年中的天数,求相隔天数。
        int days = c2.get(Calendar.DAY_OF_YEAR)-ca.get(Calendar.DAY_OF_YEAR);
        System.out.println("相差"+days+"天");
        
        
        //重新设定c2对象的时间
        System.out.println("+++++++++++++++++重新设定后时间++++++++++++:");
        c2.set(2012,11,23);//月份和日期都是0开头。月份中0表示一月。月中的日期,0表示一日。
        c2.set(Calendar.HOUR, 22);
        c2.set(Calendar.MINUTE,12);
        c2.set(Calendar.SECOND, 12);
        disPlay(c2);
        
        
        System.out.println("+++++++++++++++++修改后时间++++++++++++:");
        //向后延长29天
        ca.add(Calendar.DAY_OF_YEAR,29);
        disPlay(ca);
        //再延长10小时
        ca.add(Calendar.HOUR, 4);
        disPlay(ca);
    }
    public static void disPlay(Calendar ca) {
        String []mon = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};  
        String []week = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
        System.out.print(ca.get(Calendar.YEAR)+"年");
        System.out.print(mon[ca.get(Calendar.MONTH)]);
        System.out.print(ca.get(Calendar.DAY_OF_MONTH)+"日");
        System.out.println(week[ca.get(Calendar.DAY_OF_WEEK)]);
        System.out.print("时间:");
        System.out.print(ca.get(Calendar.HOUR_OF_DAY)+":");
        System.out.print(ca.get(Calendar.MINUTE)+":");
        System.out.println(ca.get(Calendar.SECOND));
        
        
    }
}


运行结果:  

2012年十二月8日星期六
时间:20:42:38
2012年十二月8日星期六
时间:20:42:38
相差4天
+++++++++++++++++重新设定后时间++++++++++++:
2012年十二月24日星期一
时间:10:12:12
+++++++++++++++++修改后时间++++++++++++:
2013年一月6日星期日
时间:20:42:38
2013年一月7日星期一
时间:0:42:38

热门栏目