数据库操作时,遇到时间类型,经常会涉及到 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