我们将 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 不是立即刷新其内部的记录
  在 Calendar 的方法中,get() 和 add() 会让 Calendar 立马刷新。Set() 的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。
  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);
  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 时,它会根据特定的月份检查出错误的赋值。