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

JAVA Calendar方法详解


    2. Calendar 对象的容错性,Lenient 设置
    我们知道特定的月份有不同的日期,当一个用户给出错误的日期时,Calendar 如何处理的呢?

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

    public class WhatIsCalendar
    {
    public static void main(String[] args) throws Exception{
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 1, 32, 0, 0, 0);
    System.out.println(cal1.getTime());
    cal1.setLenient(false);[Page]
    cal1.set(2000, 1, 32, 0, 0, 0);
    System.out.println(cal1.getTime());
    }
    }


    它的执行结果是:

    Tue Feb 01 00:00:00 PST 2000
    Exception in thread \"main\" java.lang.IllegalArgumentException
    at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)
    at java.util.Calendar.updateTime(Calendar.java:1508)
    at java.util.Calendar.getTimeInMillis(Calendar.java:890)
    at java.util.Calendar.getTime(Calendar.java:871)
    at WhatIsCalendar.main(WhatIsCalendar.java:12)
    当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值。

    3. 不稳定的 Calendar

    我们知道 Calendar 是可以被 serialize 的,但是我们要注意下面的问题

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

    public class UnstableCalendar implements Serializable
    {

    public static void main(String[] args) throws Exception{
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 7, 1, 0, 0 , 0);
    cal1.set(Calendar.MILLISECOND, 0);
    ObjectOutputStream out =
    new ObjectOutputStream(
    new FileOutputStream(\"newCalendar.out\"t);
    out.writeObject(cal1);
    out.close();
    ObjectInputStream in =
    new ObjectInputStream(
    new FileInputStream(\"newCalendar.out\"t);
    Calendar cal2 = (Calendar)in.readObject();
    cal2.set(Calendar.MILLISECOND, 0);
    System.out.println(cal2.getTime());
    }
    }


    运行的结果竟然是: Thu Jan 01 00:00:00 PST 1970

    它被复原到 EPOC 的起始点,我们称该 Calendar 是处于不稳定状态。这个问题的根本原因是 Java 在 serialize GregorianCalendar 时没有保存所有的信息,所以当它被恢复到内存中,又缺少足够的信息时,Calendar 会被恢复到 EPOCH 的起始值。Calendar 对象由两部分构成:字段和相对于 EPOC 的微秒时间差。字段信息是由微秒时间差计算出的,而 set() 方法不会强制 Calendar 重新计算字段。这样字段值就不对了。

    下面的代码可以解决这个问题:

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

    public class StableCalendar implements Serializable
    {

    public static void main(String[] args) throws Exception{
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2000, 7, 1, 0, 0 , 0);
    cal1.set(Calendar.MILLISECOND, 0);
    ObjectOutputStream out =
    new ObjectOutputStream(
    new FileOutputStream(\"newCalendar.out\"t);
    out.writeObject(cal1);
    out.close();
    ObjectInputStream in =
    new ObjectInputStream(
    new FileInputStream(\"newCalendar.out\"t);
    Calendar cal2 = (Calendar)in.readObject();
    cal2.get(Calendar.MILLISECOND); //先调用 get(),强制 Calendar 刷新
    cal2.set(Calendar.MILLISECOND, 0);//再设值
    System.out.println(cal2.getTime());
    }
    }


    运行的结果是: Tue Aug 01 00:00:00 PDT 2000

    这个问题主要会影响到在 EJB 编程中,参数对象中包含 Calendar 时。经过 Serialize/Deserialize 后,直接操作 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 频道导航