如何从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.Date
, juCalendar
, java.text.SimpleDateFormat
, java.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