现在的位置: 首页 > 综合 > 正文

Java 日期时间

2012年04月19日 ⁄ 综合 ⁄ 共 4367字 ⁄ 字号 评论关闭

-- Start

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 行的代码程序会抛出异常.

c.setLenient(false);

从上面例子的 79 行我们可以看到, 我们可以通过下面的方式来得到一个 TimeZone 实例, 但是我们需要指定一个 ID, 问题是我们如何判断一个 ID 是不是合法呢? 其实很简单, 我们可以调用 getAvailableIDs() 方法来查看.

TimeZone.getTimeZone("GMT")

通过上面的例子我们看到, 使用 Calendar 类操作日期真的是很复杂, 为此, 好多开源的日期框架提供了更易于使用, 功能更强大的功能, 如: Joda

---更多参见:Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-04
-- Written by ShangBo on 2012-05-03
-- End

【上篇】
【下篇】

抱歉!评论已关闭.