Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
java的timestamp转date_jdk1.8是jdk8.0吗,希望能够帮助你!!!。
tl;博士
Instant instant = myResultSet.getObject( … , Instant.class ) ;
…或者,如果您的JDBC驱动程序不支持可选的Instant,则需要支持ZoneId:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
避免同时使用Instant和Instant。它们已被java.time类替换。 具体来说,Instant类表示UTC时间轴上的时刻,分辨率为纳秒(最多十进制的九(9)位数字)。
不同的值→未验证的问题
解决问题的主要部分:“为什么当一个派生自另一个对象时,java.util.Date和java.sql.Timestamp对象之间的日期不同?”
您的代码一定有问题。 您没有发布代码,因此我们无法查明问题。
首先,为java.util.Date的值显示的字符串值不是来自其默认的Instant方法,因此您显然在进行其他操作。
其次,当我运行类似的代码时,的确确实获得了完全相同的日期时间值。
首先创建一个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 = 42
ts = 2015-06-18 15:26:25.642
millis2 = 42
date = Thu Jun 18 15:26:25 PDT 2015
因此,问题中显示的代码确实是从java.sql.Timestamp转换为java.util.Date的有效方法,尽管您将丢失任何纳秒级的数据。
java.util.Date someDate = new Date( someJUTimestamp.getTime() );
字符串输出的不同格式
请注意,如所记录的,Instant方法的输出是不同的格式。 java.sql.Timestamp遵循SQL格式,类似于ISO 8601格式,但中间没有ZoneId。
忽略继承
如对其他“答案”和“问题”的评论所讨论的那样,您应该忽略java.sql.Timestamp继承自java.util.Date的事实。 j.s.Timestamp文档明确指出您不应将其中一种视为另一种的子类型:(强调我的)
由于上述Timestamp类和java.util.Date类之间的差异,建议代码不要以java.util.Date的实例的形式一般性地查看Timestamp值。 Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。
如果您不顾Java团队的建议而采取这样的观点,那么一个严重的问题就是您将丢失数据:由于Date的分辨率只有毫秒,因此可能丢失数据库中任何微秒或纳秒的时间。
基本上,来自Java早期的所有旧日期时间类都是一个大混乱:Instant、ZoneId、ZonedDateTime、java.sql.Timestamp / .Date/.Time。 它们是行业中日期时间框架上最早的英勇尝试之一,但最终失败了。 特别是在这里,java.sql.Timestamp是一个带有纳秒级的java.util.Date。 这是一个技巧,不是好的设计。
java.time
避免与Java的早期版本捆绑在一起的旧的日期时间类。
相反,请尽可能使用Java 8及更高版本中内置的java.time包(教程)。
java.time的基础…Instant是UTC时间轴上的时刻。 应用时区(ZoneId)以获得ZonedDateTime。
从Java 8开始使用java.time的示例代码。使用支持JDBC 4.2和更高版本的JDBC驱动程序,您可以直接与数据库交换java.time类;因此,请参见参考资料。 不需要遗留类。
Instant instant = myResultSet.getObject( … , Instant.class) ; // Instant is the raw underlying data, an instantaneous point on the time-line stored as a count of nanoseconds since epoch.
您可能需要调整为UTC以外的时区。
ZoneId z = ZoneId.of( "America/Montreal" ); // Always make time zone explicit rather than relying implicitly on the JVM’s current default time zone being applied.
ZonedDateTime zdt = instant.atZone( z ) ;
执行您的业务逻辑。 在这里,我们只需添加一天。
ZonedDateTime zdtNextDay = zdt.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).
转储到控制台。
System.out.println( "instant = " + instant );
System.out.println( "zdt = " + zdt );
System.out.println( "zdtNextDay = " + zdtNextDay );
System.out.println( "dateNextDay = " + dateNextDay );
运行时。
instant = 2015-06-18T16:44:13.Z
zdt = 2015-06-18T19:44:13.-04:00[America/Montreal]
zdtNextDay = 2015-06-19T19:44:13.-04:00[America/Montreal]
dateNextDay = Fri Jun 19 16:44:13 PDT 2015
转换次数
如果必须使用旧式类型与尚未为java.time更新的旧代码进行交互,则可以进行转换。 使用添加到旧的java.util.Date和java.sql。*类中的新方法进行转换。
Instant instant = myJavaSqlTimestamp.toInstant() ;
…和…
java.sql.Timestamp ts = java.sql.Timestamp.from( instant ) ;
有关转换的更多信息,请参见教程一章,传统日期-时间代码。
小数秒
注意小数秒的分辨率。 从纳秒到毫秒的转换意味着可能会丢失一些数据。
毫秒java.util.Date
Joda-Time(启发java.time的框架)
纳秒java.sql.Timestamp
java.time
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如YearQuarter、YearQuarter和YearQuarter。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。 不需要字符串,不需要YearQuarter类。
在哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10和更高版本内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。
Java SE 6和Java SE 7很多java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
安卓系统更高版本的Android捆绑了java.time类的实现。
对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。 请参阅如何使用ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可能会在这里找到一些有用的类,例如YearQuarter、YearQuarter、YearQuarter等。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。