Java Date and Time系列(四)- java.sql.Date/java.sql.Time/java.sql.Timestamp介绍

时间:2021-04-09 17:01:38

java.sql.Date

java.sql.Date是在JDBC中使用的日期类,在JDBC操作中,如果需要设置一个日期或者从ResultSet获取日期值,就需要使用到java.sql.Date。实际上java.sql.Date继承自java.util.Date,是java.util.Date的一个子类,所以java.util.Date可以调用的方法在java.sql.Date中也可以调用。

创建一个java.sql.Date实例也像java.util.Date一样简单:

long time = System.currentTimeMillis();
java.sql.Date date = new java.sql.Date(time);
那么java.util.Date和java.sql.Date之间到底有什么区别呢?它们之间最大的区别就是:java.util.Date是一个日期和时间的完整表示,java.sql.Date只表示日期而不包含时间,比如java.util.Date实例可以表示2013-11-30 21:11:30.034,但java.sql.Date实例却只能表示2013-11-30。如果试图在java.util.Date实例上调用和时间相关的方法将会抛出一个java.lang.IllegalArgumentException异常:
long timeNow = System.currentTimeMillis();java.sql.Date sDate = new java.sql.Date(timeNow);sDate.getHours(); //抛出java.lang.IllegalArgumentException

java.sql.Time

java.sql.Time是JDBC中用来表示时间的类,它也是java.util.Date的子类,可以像下面一样创建一个Time实例:

long timeNow = System.currentTimeMillis();
java.sql.Time time = new java.sql.Time(timeNow);
和java.sql.Date的道理一样,这个类只能表示时间却不能包含日期部分,如果试图在java.sql.Time实例上调用和日期相关的方法
将会抛出一个java.lang.IllegalArgumentException异常:
long timeNow = System.currentTimeMillis();
java.sql.Time time = new java.sql.Time(timeNow);
time.getYear(); //抛出java.lang.IllegalArgumentException

所以,如果在JDBC中需要像java.util.Date一样能够完整表示日期和时间,那么应该考虑使用java.sql.Timestamp,而不是java.sql.Date或java.sql.Time。


java.sql.Timestamp

java.sql.Timestamp也是继承自java.util.Date,它和java.util.Date一样既能表示日期也能表示时间。java.sql.Timestamp和java.util.Date的一个区别就是java.util.Date只能表示到毫秒级,而java.sql.Timestamp能表示到纳秒级。

long time = System.currentTimeMillis();
java.sql.Timestamp timestamp = new java.sql.Timestamp(time);

timestamp.setNanos(123456);
int nanos = timestamp.getNanos(); // nanos = 123456