博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 日期时间
阅读量:4050 次
发布时间:2019-05-25

本文共 4958 字,大约阅读时间需要 16 分钟。

-- 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

---
更多参见:
--
声 明:转载请注明出处
-- Last Updated on 2012-05-04
-- Written by ShangBo on 2012-05-03
-- End
你可能感兴趣的文章
PB中使用blob进行文件读取的性能问题
查看>>
DataWindow.net中如何实现鼠标划过时变颜色
查看>>
Datawindow.net中设置字符串的显示,超过长度部分显示为。。。
查看>>
PowerBuilder中使用带返回的powerobjectparm
查看>>
从oracle表中随机取记录,产生随机数和随机字符串
查看>>
功夫熊猫,中国式的哲学和西方式的搞笑
查看>>
Oracle SYS口令深入解析
查看>>
XP中IIS“http500”错误的终极解决方法
查看>>
李开复眼中的兰迪教授:引领你的一生
查看>>
早起的虫儿被鸟吃?
查看>>
Love Your Life》—— 热爱生活
查看>>
一个高速交警的忠告
查看>>
新车装饰的中国特色
查看>>
没看过这么NB的自驾游,笑的我眼泪都出来了
查看>>
李涯的哭
查看>>
和机器学习和计算机视觉相关的数学
查看>>
论文MICO for MRI bias field estimation and tissue segmentation品讲
查看>>
后现代
查看>>
VMware6关机后出现is not a valid virtual machine configuration file的解决办法
查看>>
通过ASP实现flash对数据库的访问
查看>>