java的timestamp转date_jdk1.8是jdk8.0吗

Java (5) 2024-08-14 14:12

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等。

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复