您的位置:首页 > 编程语言 > Java开发

java中几个时间的区别(java.sql.date,java.sql.time,java.sql.Timestamp)

2016-01-20 11:50 525 查看
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、以及与MySQL日期类型的对应

一、java.util.Date表示某一特定时刻,精确到毫秒。

java.util.Date日期格式为:年月日时分秒



类声明如下:

public class Date

implements java.io.Serializable, Cloneable, Comparable<Date>

类的构造函数:

1.Date();以系统当前时间初始化该对象。

2.Date(long date);用毫秒数初始化对象,以1970年1月1日00:00:00 GMT标准基准时间的毫秒数,即要初始化的时间减去1970年的时间的毫秒数。

该类的常用函数

1 boolean after(Date when)

此方法测试,此日期是否在指定日期之后。

2 boolean before(Date when)

此方法测试,此日期是否在指定日期之前。

3 Object clone()

此方法返回此对象的一个副本。

4 int compareTo(Date anotherDate)

此方法比较两个日期的顺序。

5 boolean equals(Object obj)

此方法比较两个日期是否相等。

6 long getTime()

此方法返回自1970年1月1日00:00:00 GMT此Date对象表示的毫秒数。

7 int hashCode()

此方法返回此对象的哈希码值。

8 void setTime(long time)

此方法设置此Date对象1970年1月1日00:00:00 GMT以后,代表一个时间点time毫秒。

9 String toString()

此方法此Date对象转换为形式的字符串。

二、java.sql.Date、java.sql.Time、java.sql.Timestamp

java.lang.Object

....|__java.util.Date

..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据]

java.sql.Time日期格式为:时分秒

java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)

java.sql.Date, java.sql.Time, java.slq.Timestamp这三个类是java.util.Date的子类。这三个类对java.util.Date类进行了包装。

联系:

java.sql.Date类屏蔽了java.util.Date类的时间有关的方法(形如:hh:mm:ss),因此,不可以通过这个类访问时间有关的信息,比如,如果你通过sqlDate.getHour()方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

Java.sql.Time类屏蔽了java.util.Date的日期有关的字段(形如:yyyy-MM-dd),因此,不能通过这个类访问日期有关的信息,比如:如果你通过sqlTime.getYear()方法去获取年有关的信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

三、MySQL数据中的日期类型

MySQL 日期类型:日期格式、所占存储空间、日期范围 比较。

日期类型 存储空间 日期格式 日期范围

------------ --------- --------------------- -----------------------------------------

datetime 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

timestamp 4 bytes YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 ~ 2038

date 3 bytes YYYY-MM-DD 1000-01-01 ~ 9999-12-31

year 1 bytes YYYY 1901 ~ 2155

在 MySQL 中创建表时,对照上面的表格,很容易就能选择到合适自己的数据类型。不过到底是选择 datetime 还是 timestamp,可能会有点犯难。这两个日期时间类型各有优点:datetime 的日期范围比较大;timestamp 所占存储空间比较小,只是 datetime 的一半。

timestamp 类型的列还有个特性:默认情况下,在 insert, update 数据时,timestamp 列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。“自动”的意思就是,你不去管它,MySQL 会替你去处理。

建表的代码为:

create table t8 (

`id1` timestamp NOT NULL default CURRENT_TIMESTAMP,

`id2` datetime default NULL

);

两者之间的比较:

1. timestamp容易所支持的范围比timedate要小。 并且容易出现超出的情况

2.timestamp比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响.

MySQL 时间类型:时间格式、所占存储空间、时间范围。

时间类型 存储空间 时间格式 时间范围

------------ --------- --------------------- -----------------------------------------

time 3 bytes HH:MM:SS -838:59:59 ~ 838:59:59

time 时间范围居然有这么大的范围,特别是 time 可以取负值,有点奇怪。后来,看了 MySQL 手册才知道这是为了满足两个日期时间相减才这样设计的。

select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00'); -- 743:59:59

select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59'); -- -743:59:59

select timediff('23:59:59', '12:00:00'); -- 11:59:59

注意,timediff 的两个参数只能是 datetime/timestamp, time 类型的,并且这两个参数类型要相同。即:datetime/timestamp 和 datetime/timestamp 比较;time 和 time 相比较。

虽然 MySQL 中的日期时间类型比较丰富,但遗憾的是,目前(2008-08-08)这些日期时间类型只能支持到秒级别,不支持毫秒、微秒。也没有产生毫秒的函数。

相关链接:http://www.jb51.net/article/23966.htm
http://www.iteye.com/topic/1137830 http://www.yiibai.com/java/util/java_util_date.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: