首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
中国IT实验室Linux频道
中国IT教育
 
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 新手入门 >> 基础入门 >> 文章正文

JAVA Calendar方法详解

文章来源中国IT实验室收集整理 作者佚名 更新时间2008-5-7 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页

    究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢?

    比如有:
    月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同;阴(农)历,每个月固定28天
    每周的第一天 - 阳(公)历星期日是第一天;阴(农)历,星期一是第一天

    实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个人的生日是\"八月八日\" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是 \"Gregorian Calendar\"。也就是我们在讲述年份时常用 \"公元几几年\"。Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。Java 本身提供了对 \"Gregorian Calendar\" 规则的实现。我们从 Calendar.getInstance() 中所获得的实例就是一个 \"GreogrianCalendar\" 对象(与您通过 new GregorianCalendar() 获得的结果一致)。

    下面的代码可以证明这一点:

    import java.io.*;
    import java.util.*;

    public class WhatIsCalendar
    {
    public static void main(String[] args) {
    Calendar calendar = Calendar.getInstance();
    if (calendar instanceof GregorianCalendar)
    System.out.println(\"It is an instance of GregorianCalendar\"t;
    }
    }


    Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。

    我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 IBM alphaWorks 上,IBM 的开发人员实现了多种日历(http://www.alphaworks.ibm.com/tech/calendars)。同样在 Internet 上,也有对中国农历的实现。本文对如何扩展 Calendar 不作讨论,大家可以通过察看上述 Calendar 的源码来学习。

    Calendar 与 Date 的转换非常简单:

    Calendar calendar = Calendar.getInstance();
    // 从一个 Calendar 对象中获取 Date 对象
    Date date = calendar.getTime();
    // 将 Date 对象反应到一个 Calendar 对象中,
    // Calendar/GregorianCalendar 没有构造函数可以接受 Date 对象
    // 所以我们必需先获得一个实例,然后设置 Date 对象
    calendar.setTime(date);


    Calendar 对象在使用时,有一些值得注意的事项:

    1. Calendar 的 set() 方法

    set(int field, int value) - 是用来设置\"年/月/日/小时/分钟/秒/微秒\"等值

    field 的定义在 Calendar 中

    set(int year, int month, int day, int hour, int minute, int second) 但没有

    set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不会自动将 MilliSecond 清为 0。

    另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。

    calendar.set(Calendar.MONTH, 7);

    我们通常需要在程序逻辑中将它清为 0,否则可能会出现下面的情况:

    import java.io.*;
    import java.util.*;

    public class WhatIsCalendarWrite
    {
    public static void main(String[] args) throws Exception{[Page]
    ObjectOutputStream out =
    new ObjectOutputStream(
    new FileOutputStream(\"calendar.out\"t);
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 7, 1, 0, 0, 0);
    out.writeObject(cal1);
    Calendar cal2 = Calendar.getInstance();
    cal2.set(2000, 7, 1, 0, 0, 0);
    cal2.set(Calendar.MILLISECOND, 0);
    out.writeObject(cal2);
    out.close();
    }
    }


    我们将 Calendar 保存到文件中

    import java.io.*;
    import java.util.*;

    public class WhatIsCalendarRead
    {
    public static void main(String[] args) throws Exception{
    ObjectInputStream in =
    new ObjectInputStream(
    new FileInputStream(\"calendar.out\"t);
    Calendar cal2 = (Calendar)in.readObject();
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 7, 1, 0, 0, 0);
    if (cal1.equals(cal2))
    System.out.println(\"Equals\"t;
    else
    System.out.println(\"NotEqual\"t;
    System.out.println(\"Old calendar \"+cal2.getTime().getTime());
    System.out.println(\"New calendar \"+cal1.getTime().getTime());
    cal1.set(Calendar.MILLISECOND, 0);
    cal2 = (Calendar)in.readObject();
    if (cal1.equals(cal2))
    System.out.println(\"Equals\"t;
    else
    System.out.println(\"NotEqual\"t;
    System.out.println(\"Processed Old calendar \"+cal2.getTime().getTime());
    System.out.println(\"Processed New calendar \"+cal1.getTime().getTime());
    }
    }

    然后再另外一个程序中取回来(模拟对数据库的存储),但是执行的结果是:

    NotEqual
    Old calendar 965113200422 <------------ 最后三位的MilliSecond与当前时间有关
    New calendar 965113200059 <-----------/
    Equals
    Processed Old calendar 965113200000
    Processed New calendar 965113200000


    另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:

    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
    cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1
    cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30
    System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录

[1] [2] [3] [4] 下一页  

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题
 ·展现C#世界 C#程序设计专题
 ·Java入门 Tomcat的配置技巧精华专题
 ·Oracle RMAN物理备份技术详解
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航