-- Start
--- 更多参见: Java 精萃Java 使用 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 行的代码程序会抛出异常.
从上面例子的 79 行我们可以看到, 我们可以通过下面的方式来得到一个 TimeZone 实例, 但是我们需要指定一个 ID, 问题是我们如何判断一个 ID 是不是合法呢? 其实很简单, 我们可以调用 getAvailableIDs() 方法来查看.c.setLenient(false);
TimeZone.getTimeZone("GMT")
通过上面的例子我们看到, 使用 Calendar 类操作日期真的是很复杂, 为此, 好多开源的日期框架提供了更易于使用, 功能更强大的功能, 如: Joda
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-04
-- Written by ShangBo on 2012-05-03
-- End