数据库操作时,遇到时间类型,经常会涉及到 java.sql.Date与java.util.Date 之间的转换。
在此,总结一个简单的转换方法。
查看java.util.Date类的源码
/**
* Allocates a <code>Date</code> object and initializes it so that
* it represents the time at which it was allocated, measured to the
* nearest millisecond.
*
* @see java.lang.System#currentTimeMillis()
*/
public Date() {
this(System.currentTimeMillis());
}
/**
* Allocates a <code>Date</code> object and initializes it to
* represent the specified number of milliseconds since the
* standard base time known as "the epoch", namely January 1,
* 1970, 00:00:00 GMT.
*
* @param date the milliseconds since January 1, 1970, 00:00:00 GMT.
* @see java.lang.System#currentTimeMillis()
*/
public Date(long date) {
fastTime = date;
}
可以得知,java 中的Date 取得就是系统的当前时间距1970年的毫秒数。
而 java.sql.Date 继承了java.util.Date
/*
* Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.sql;
/**
* <P>A thin wrapper around a millisecond value that allows
* JDBC to identify this as an SQL <code>DATE</code> value. A
* milliseconds value represents the number of milliseconds that
* have passed since January 1, 1970 00:00:00.000 GMT.
* <p>
* To conform with the definition of SQL <code>DATE</code>, the
* millisecond values wrapped by a <code>java.sql.Date</code> instance
* must be 'normalized' by setting the
* hours, minutes, seconds, and milliseconds to zero in the particular
* time zone with which the instance is associated.
*/
public class Date extends java.util.Date {
/**
* Constructs a <code>Date</code> object initialized with the given
* year, month, and day.
* <P>
* The result is undefined if a given argument is out of bounds.
*
* @param year the year minus 1900; must be 0 to 8099. (Note that
* 8099 is 9999 minus 1900.)
* @param month 0 to 11
* @param day 1 to 31
* @deprecated instead use the constructor <code>Date(long date)</code>
*/
public Date(int year, int month, int day) {
super(year, month, day);
}
/**
* Constructs a <code>Date</code> object using the given milliseconds
* time value. If the given milliseconds value contains time
* information, the driver will set the time components to the
* time in the default time zone (the time zone of the Java virtual
* machine running the application) that corresponds to zero GMT.
*
* @param date milliseconds since January 1, 1970, 00:00:00 GMT not
* to exceed the milliseconds representation for the year 8099.
* A negative number indicates the number of milliseconds
* before January 1, 1970, 00:00:00 GMT.
*/
public Date(long date) {
// If the millisecond date value contains time info, mask it out.
super(date);
}
/**
* Sets an existing <code>Date</code> object
* using the given milliseconds time value.
* If the given milliseconds value contains time information,
* the driver will set the time components to the
* time in the default time zone (the time zone of the Java virtual
* machine running the application) that corresponds to zero GMT.
*
* @param date milliseconds since January 1, 1970, 00:00:00 GMT not
* to exceed the milliseconds representation for the year 8099.
* A negative number indicates the number of milliseconds
* before January 1, 1970, 00:00:00 GMT.
*/
public void setTime(long date) {
// If the millisecond date value contains time info, mask it out.
super.setTime(date);
}
/**
* Private serial version unique ID to ensure serialization
* compatibility.
*/
static final long serialVersionUID = 1511598038487230103L;
}
由于 java.sql.Date 继承自 java.util.Date,那么两种Date类型有个共同的方法,就是getTime()。
利用getTime进行格式的转换时,时间不会有精度的丢失。
public class DateTest {
public static void main(String args[]) {
// 定义当前时间
java.util.Date now = new java.util.Date();
// 将java.util.sql 转为 java.sql.date
java.sql.Date sqlNow = new java.sql.Date(now.getTime());
// 将java.sql.date 转为 java.util.date
java.util.Date utilNow = new java.util.Date(sqlNow.getTime());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(now);
System.out.println(df.format(sqlNow));
System.out.println(utilNow);
}
}
控制台输出
Wed Dec 25 17:27:33 GMT+08:00 2013 2013-12-25 17:27:33 Wed Dec 25 17:27:33 GMT+08:00 2013