您所在的位置: 首页 > 开发 > JAVA >

谨慎使用Date和Time类

  • 摘要:本文讲述AVA里提供的日期和时间类的使用。
  • 标签:Java    Date  Time

AVA里提供的日期和时间类,java.sql.Date和java.sql.Time,只会从数据库里读取某部分值,这有时会导致丢失数据。例如一个包含2002/05/22 5:00:57 PM的字段,读取日期时得到的是2002/05/22,而读取时间时得到的是5:00:57 PM。

你需要了解数据库里存储时间的精度。有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG:

获得一个JAVA里的日期对象

从数据库里读取日期
试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。

java.sql.Timestamp类比java.util.Date类精确度要高。这个类包含了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用getNanos()方法。有毫微秒部分(即额外精度部分)的数值可能比没有这个部分的数值的大一个毫秒。如果你知道你使用的数据库保存了毫秒部分,可以用下面的代码获得的数值:

<%@ control language="c#" autoeventwireup="true" codefile="webusercontrol2.ascx.cs"

inherits="webusercontrol2" %>long time=timestamp.getTime()+timestamp.getNanos()/1000000;

毫微秒的部分就是为什么一个java.sql.Timestamp对象不等于一个java.util.Date对象,而一个java.util.Date对象可能等于一个java.sql.Timestamp对象的原因。这使得equals方法应当保持的对称被打破了。

使用java.sql包中的与时间相关的类是重要的,但是它们也可能导致人为的错误。

这是因为,这些类的复杂性虽然已经在javadoc里面清楚的描述了,但是由于这些类看上去很简单而很少有人看这些文档。

(责任编辑 火凤凰 sunsj@51cto.com  TEL:(010)68476636-8007)


Oracle以74亿美元收购Sun
SaaS时代的软件开发
企业级Web2.0 你准备好了么?
浏览器的战国时代
调查:十大发现 解秘技术人
 
 验证码: (点击刷新验证码)   匿名发表
  • 亮剑.NET. 图解C#开发实战

  • 作者:李新峰 付志涛 缪勇
  • 本书采用全新的图解思路,分3篇介绍使用微软C#语言开发实际应用程序的基本知识。第1篇包括10章,介绍了C#语言的基础知识,主要..
Copyright©2005-2009 51CTO.COM 版权所有