如何从java.sql.Timestamp转换为java.util.Date?

这个代码

startDate = new Date(timestampValue.getTime)); 

给我 :

2012-16-02 05:16:17

什么时候

 System.out.println(timestampValue); 

返回:

2012-01-02 05:16:17.0

您应该使用日历来代替:

 Calendar start = Calendar.getInstance(); start.setTimeInMillis( timeStampValue.getTime() ); 

java.sql.TimeStamp类从java.util.Date

您可以直接将TimeStamp对象分配给Date引用:

 TimeStamp timeStamp = //whatever value you have; Date startDate = timestampValue; 

不同的价值观→未经证实的问题

为了解决这个问题的主要部分:“为什么java.util.Date和java.sql.Timestamp对象之间的不同date,当一个从另一个派生?

你的代码一定有问题。 你没有发布你的代码,所以我们不能指出问题。

首先,你为java.util.Date的值显示的string值不是来自默认的toString方法,所以你明显在做额外的操作。

其次,当我运行类似的代码,我确实得到完全相同的date – 时间值。

首先创build一个java.sql.Timestamp对象。

 // Timestamp long millis1 = new java.util.Date().getTime(); java.sql.Timestamp ts = new java.sql.Timestamp(millis1); 

现在提取毫秒数以便实例化一个java.util.Date对象。

 // Date long millis2 = ts.getTime(); java.util.Date date = new java.util.Date( millis2 ); 

将值转储到控制台。

 System.out.println("millis1 = " + millis1 ); System.out.println("ts = " + ts ); System.out.println("millis2 = " + millis2 ); System.out.println("date = " + date ); 

运行时。

 millis1 = 1434666385642 ts = 2015-06-18 15:26:25.642 millis2 = 1434666385642 date = Thu Jun 18 15:26:25 PDT 2015 

因此,问题中显示的代码确实是将java.sql.Timestamp转换为java.util.Date的有效方法,尽pipe您将丢失任何纳秒数据。

 java.util.Date someDate = new Date( someJUTimestamp.getTime() ); 

string输出的不同格式

请注意, toString方法的输出是不同的格式,如logging。 java.sql.Timestamp遵循SQL格式,类似于ISO 8601格式,但没有中间的T

忽略inheritance

正如讨论其他答案和问题上的评论,你应该忽略java.sql.Timestamp从java.util.Dateinheritance的事实。 jsTimestamp文档明确指出,你不应该将其中一个视为另一个的子types:(强调我的)

由于Timestamp类和上面提到的java.util.Date类的区别,build议代码不要将Timestamp值作为java.util.Date的实例来查看 。 Timestamp和java.util.Date之间的inheritance关系实际上表示实现inheritance,而不是typesinheritance。

如果您忽略Java团队的build议并采取这样的观点,一个关键问题是您将丢失数据 :由于Date只有毫秒分辨率,可能来自数据库的任何微秒或纳秒部分都将丢失。

基本上,Java早期的所有旧的date – 时间类是一个很大的混乱: java.util.DatejuCalendarjava.text.SimpleDateFormatjava.sql.Timestamp / .Date / .Time 。 他们是行业中date时间框架的第一个勇敢的努力之一,但最终却失败了。 具体来说,java.sql.Timestamp是一个纳秒级的java.util.Date; 这是一个黑客,不好的devise。

java.time

避免与早期版本的Java捆绑在一起的旧date时间类。

而应尽可能使用内置于Java 8及更高版本中的java.time包 ( Tutorial )。 只有在互操作性需要时才转换为java.util.Date ,并在工作的最后阶段执行此操作。 使用新的方法添加到旧的java.util.Date和java.sql。*类进行转换。

java.time的基础知识… Instant是UTC中时间轴上的一个时刻。 应用时区( ZoneId )来获取ZonedDateTime

从Java 8起使用java.time的代码示例

模拟通过JDBC从数据库获取时间戳。

 long millisForTs = new java.util.Date( ).getTime( ); // Extract milliseconds-since-epoch long integer. (not "int"!) java.sql.Timestamp ts = new java.sql.Timestamp( millisForTs ); // Represents a value in UTC time zone implicitly. ts.setNanos( 123456789 ); // Simulate the microseconds/nanoseconds that may be present in a true Timestamp (depending on the resolution of the database source). 

转换为java.time对象。 指定调整UTC值所需的时区。

 java.time.Instant instant = ts.toInstant( ); // Instant is the raw underlying data, an instantaneous point on the time-line stored as a count of nanoseconds since epoch. ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Always make time zone explicit rather than relying implicitly on the JVM's current default time zone being applied. ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant( instant, zoneId ); // Take raw count-from-epoch and apply a particular time zone. 

执行您的业务逻辑。 在这里,我们只需添加一天。

 ZonedDateTime zdtNextDay = zonedDateTime.plusDays( 1 ); // Add a day to get "day after". 

在最后阶段,如果绝对需要,转换为java.util.Date以实现互操作性。

 java.util.Date dateNextDay = Date.from( zdtNextDay.toInstant( ) ); // WARNING: Losing data (the nanoseconds resolution). 

或者,也许你需要另一个java.sql.Timestamp放入数据库。

 java.sql.Timestamp tsNextDay = java.sql.Timestamp.from( zdtNextDay.toInstant( ) ); 

转储到控制台。

 System.out.println( "ts = " + ts ); System.out.println( "zonedDateTime = " + zonedDateTime ); System.out.println( "zdtNextDay = " + zdtNextDay ); System.out.println( "dateNextDay = " + dateNextDay ); System.out.println( "tsNextDay = " + tsNextDay ); 

运行时。

 ts = 2015-06-18 16:44:13.123456789 zonedDateTime = 2015-06-18T19:44:13.123456789-04:00[America/Montreal] zdtNextDay = 2015-06-19T19:44:13.123456789-04:00[America/Montreal] dateNextDay = Fri Jun 19 16:44:13 PDT 2015 tsNextDay = 2015-06-19 16:44:13.123456789 

分数秒

请注意分数秒的分辨率。 从纳秒到毫秒的转换意味着可能会丢失一些数据。

  • 毫秒
    • java.util.Date
    • Joda-Time (启发java.time的框架)
  • 纳秒
    • 的java.sql.Timestamp
    • java.time

教程

有关转换的更多信息,请参阅教程一章“ 传统date – 时间代码” 。

未来的JDBC驱动程序

最终,世界的JDBC驱动程序将被更新为直接支持新的java.time数据types,而不是旧的java.sql.Timestamp / .Date / .Time。 这将意味着更less的这种转换代码。

同时,从Java 8开始,使用添加到旧类中的转换方法。

问题可能来自date已被弃用的事实。

考虑使用

java.util.Calendar中

要么

乔达时间

编辑2015:

Java 8及更高版本内置了新的java.time包 ,类似于Joda-Time 。

 public static Date convertTimestampToDate(Timestamp timestamp) { Instant ins=timestamp.toLocalDateTime().atZone(ZoneId.systemDefault()).toInstant(); return Date.from(ins); } 
 java.sql.ResultSet rs; //fill rs somehow java.sql.Timestamp timestamp = rs.getTimestamp(1); //get first column long milliseconds = timestamp.getTime() + (timestamp.getNanos() / 1000000); java.util.Date date = return new java.util.Date(milliseconds); 

花哨的新Java 8方式是Date.from(timestamp.toInstant()) 。 在别处看到类似的答案。

时间戳是date: https : //docs.oracle.com/javase/7/docs/api/java/sql/Timestamp.html

 java.lang.Object java.util.Date java.sql.Timestamp