本文共 4958 字,大约阅读时间需要 16 分钟。
-- Start
--- 更多参见: -- 声 明:转载请注明出处 -- Last Updated on 2012-05-04 -- Written by ShangBo on 2012-05-03 -- EndJava 使用 Date 类来表示日期和时间, 从 JDK 1.1 开始, Date 类中的大部分方法已经不推荐使用了, 原因是这些方法不能满足国际化的要求. 取而代之的是使用 Calendar 类来对日期进行操作, 使用 DateFormat 类来对日期格式化.
我将在下一节为大家介绍有关数字和日期格式化的相关知识, 本节主要关注日期操作. 显然, 为了对日期进行操作, 我们经常需要在 Date 和 Calendar 类之间转换. 下面是一个简单的例子.public static void main(String[] args) throws Exception { // 定义当前日期 Date today = new Date(); System.out.println("Today is " + today); // 将 Date 转换为 Calendar Calendar c = Calendar.getInstance(); c.setTime(today); // 给该日期加一天 c.add(Calendar.DAY_OF_MONTH, 1); // 将 Calendar 转换为 Date Date tomorrow = c.getTime(); System.out.println("Torrow is " + tomorrow);}大家想想, 通常我们想对日期进行什么样的操作呢? 首先我们必须能够 定义一个具体的日期; 有时候我们需要 获得日期的各个组成部分, 如: 年/月/日/时/分/秒等; 有时候我们也需要 比较两个日期的大小; 有时候我们需要 计算两个日期的间隔, 如: 年/月/日/时/分/秒等; 有时候我们需要 计算给特定日期加上或减去 n 年/月/日/时/分/秒 后的结果; 还有些时候我们可能要进行 时区转换. 下面我们通过一个具体的例子来看看如何对日期进行操作.public static void main(String[] args) throws Exception { // 定义一个具体的日期 System.out.println("------ 定义一个具体的日期 ------"); Calendar c = Calendar.getInstance(); c.set(2012, 4, 31, 17, 02, 20); // 2012-05-31 17:02:20 System.out.println(c.getTime()); System.out.println("\n"); // 获得日期的各个组成部分 System.out.println("------ 获得日期的各个组成部分 ------"); System.out.println("年: " + c.get(Calendar.YEAR)); System.out.println("月: " + (c.get(Calendar.MONTH) + 1)); // January is 0 System.out.println("日: " + c.get(Calendar.DAY_OF_MONTH)); System.out.println("时: " + c.get(Calendar.HOUR_OF_DAY)); System.out.println("分: " + c.get(Calendar.MINUTE)); System.out.println("秒: " + c.get(Calendar.SECOND)); System.out.println("星期: " + (c.get(Calendar.DAY_OF_WEEK) - 1)); // Sunday is 1 System.out.println("\n"); // 比较两个日期的大小 System.out.println("------ 比较两个日期的大小 ------"); Calendar now = Calendar.getInstance(); if (now.before(c)) { System.out.println(now.getTime() + " 在 " + c.getTime() + " 之前."); } if (now.after(c)) { System.out.println(now.getTime() + " 在 " + c.getTime() + " 之后."); } if (now.compareTo(c) > 0) { System.out.println(now.getTime() + " 大于 " + c.getTime()); } System.out.println("\n"); // 计算两个日期的间隔 System.out.println("------ 计算两个日期的间隔 ------"); long dateInterval = Math.abs(c.getTime().getTime() - now.getTime().getTime()) / (1 * 24 * 60 * 60 * 1000); System.out.println(now.getTime() + " 和 " + c.getTime() + " 的时间间隔是 " + dateInterval + " 天."); System.out.println("\n"); // 计算给特定日期加上或减去 n 年/月/日/时/分/秒 后的结果 System.out.println("------ 计算给特定日期加上或减去 1 年/月/日/时/分/秒 后的结果 ------"); c.add(Calendar.YEAR, 1); // 加1年 System.out.println("加1年: " + c.getTime()); c.add(Calendar.MONTH, 1); // 加1月 System.out.println("加1月: " + c.getTime()); c.add(Calendar.DAY_OF_MONTH, 1); // 加1日 System.out.println("加1日: " + c.getTime()); c.add(Calendar.DAY_OF_MONTH, 32); // 加32日 System.out.println("加32日: " + c.getTime()); c.add(Calendar.HOUR_OF_DAY, 1); // 加1时 System.out.println("加1时: " + c.getTime()); c.add(Calendar.MINUTE, 1); // 加1分 System.out.println("加1分: " + c.getTime()); c.add(Calendar.SECOND, 1); // 加1秒 System.out.println("加1秒: " + c.getTime()); System.out.println("\n"); // 时区转换 c.clear(); // 清空设置 c.set(2012, 4, 31, 17, 02, 20); // 2012-05-31 17:02:20 System.out.println("------ 时区转换 ------"); System.out.println("当前时区: " + c.getTimeZone().getDisplayName()); System.out.println("当前时间: " + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) + " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND)); c.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println("转换后时区: " + c.getTimeZone().getDisplayName()); System.out.println("转换后时间: " + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" + c.get(Calendar.DAY_OF_MONTH) + " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND));}运行结果如下:
------ 定义一个具体的日期 ------Thu May 31 17:02:20 CDT 2012------ 获得日期的各个组成部分 ------年: 2012月: 5日: 31时: 17分: 2秒: 20星期: 4------ 比较两个日期的大小 ------Fri May 04 00:41:19 CDT 2012 在 Thu May 31 17:02:20 CDT 2012 之前.------ 计算两个日期的间隔 ------Fri May 04 00:41:19 CDT 2012 和 Thu May 31 17:02:20 CDT 2012 的时间间隔是 27 天.------ 计算给特定日期加上或减去 1 年/月/日/时/分/秒 后的结果 ------加1年: Fri May 31 17:02:20 CDT 2013加1月: Sun Jun 30 17:02:20 CDT 2013加1日: Mon Jul 01 17:02:20 CDT 2013加32日: Fri Aug 02 17:02:20 CDT 2013加1时: Fri Aug 02 18:02:20 CDT 2013加1分: Fri Aug 02 18:03:20 CDT 2013加1秒: Fri Aug 02 18:03:21 CDT 2013------ 时区转换 ------当前时区: Central Standard Time当前时间: 2012-5-31 17:2:20转换后时区: Greenwich Mean Time转换后时间: 2012-5-31 22:2:20从上面的例子我们可以看到, Calendar 类并没有提供计算日期的间隔的方法, 我们需要自己手动计算.
注意看上面例子的 58 行, 我们给日期加了 32 天, 但是程序并没有抛异常, 原因是 Calendar 类默认采用宽松(leniency)的计算方式, 当然我们也可以通过调用下面的方法将它改为严格的模式, 此时, 再次运行 58 行的代码程序会抛出异常.
c.setLenient(false);从上面例子的 79 行我们可以看到, 我们可以通过下面的方式来得到一个 TimeZone 实例, 但是我们需要指定一个 ID, 问题是我们如何判断一个 ID 是不是合法呢? 其实很简单, 我们可以调用 getAvailableIDs() 方法来查看.TimeZone.getTimeZone("GMT")通过上面的例子我们看到, 使用 Calendar 类操作日期真的是很复杂, 为此, 好多开源的日期框架提供了更易于使用, 功能更强大的功能, 如: Joda