将java.util.Date转换为java.sql.Date会截断时间部分

将java.util.Date转换为java.sql.Date会截断时间部分,java,sql-server,date,Java,Sql Server,Date,我正在尝试使用JDBC将应用程序中的java.util.Date保存到SQL Server数据库中 当我使用下面的方法将java.util.Date转换为java.sql.Date时,它会截断时间部分 java.sql.Date javaSqlExpiryDate = new java.sql.Date(javaUtilExpiryDate.getTime()); System.out.println("javaUtilExpiryDate: " + javaUtilExpiryDate.toS

我正在尝试使用JDBC将应用程序中的
java.util.Date
保存到SQL Server数据库中

当我使用下面的方法将
java.util.Date
转换为
java.sql.Date
时,它会截断时间部分

java.sql.Date javaSqlExpiryDate = new java.sql.Date(javaUtilExpiryDate.getTime());
System.out.println("javaUtilExpiryDate: " + javaUtilExpiryDate.toString());
System.out.println("javaSqlExpiryDate: " + javaSqlExpiryDate.toString());
控制台窗口将输出报告为:

Javautilexpyrydate:Thu Sep 01 18:19:08 IST 2016

javaSqlExpiryDate:2016-09-01


如何让它也保留时间部分?

只需将导入内容从
java.sql.Date
更改为
java.sql.Timestamp

只需将导入内容从
java.sql.Date
更改为
java.sql.Timestamp

是的,这是预期和记录的行为

为了符合SQL日期的定义,必须通过将实例关联的特定时区中的小时、分钟、秒和毫秒设置为零来“规范化”java.SQL.DATE实例包装的毫秒值


如果要保留时间,需要使用
java.sql.Timestamp
(特别是如果数据库中的列定义为
datetime
)。

是的,这是预期和记录的行为

为了符合SQL日期的定义,必须通过将实例关联的特定时区中的小时、分钟、秒和毫秒设置为零来“规范化”java.SQL.DATE实例包装的毫秒值

如果要保留时间,需要使用
java.sql.Timestamp
(尤其是数据库中的列定义为
datetime
)。

tl;博士 细节 其他答案是正确的。
java.util.Date
类表示UTC中的日期和时间。
java.sql.Date
只表示一个日期,不表示一天中的时间。实际上,
java.sql.Date
假装只表示一个日期,但实际上,作为一个设计糟糕的黑客,它将
java.util.Date
类划分为子类,因此确实有一个时间。令人困惑对避免这些可怕的旧遗留类的原因之一

现在我们有了更好的方法,java.time类

java.time 在过去,您会将
java.util.Date
对象转换为
java.sql.Timestamp

现在,通过支持JDBC 4.2及更高版本,您可以直接将java.time对象发送到数据库或从数据库发送。不需要java.util或java.sql类,只需使用java.time类即可

如果必须使用
java.util.Date
与旧代码交互,请使用添加到旧类中的新方法将其转换为
java.time.Instant

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

通过
PreparedStatement::setObject
ResultSet::getObject
与数据库交换
Instant

myPreparedStatement.setObject( … , instant ) ;
而且

Instant instant = myResultSet.getObject( … , Instant.class ) ;
要通过UTC以外的其他时区查看此时刻,请应用
ZoneId
以获取
zoneDateTime

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 细节 其他答案是正确的。
java.util.Date
类表示UTC中的日期和时间。
java.sql.Date
只表示一个日期,不表示一天中的时间。实际上,
java.sql.Date
假装只表示一个日期,但实际上,作为一个设计糟糕的黑客,它将
java.util.Date
类划分为子类,因此确实有一个时间。令人困惑对避免这些可怕的旧遗留类的原因之一

现在我们有了更好的方法,java.time类

java.time 在过去,您会将
java.util.Date
对象转换为
java.sql.Timestamp

现在,通过支持JDBC 4.2及更高版本,您可以直接将java.time对象发送到数据库或从数据库发送。不需要java.util或java.sql类,只需使用java.time类即可

如果必须使用
java.util.Date
与旧代码交互,请使用添加到旧类中的新方法将其转换为
java.time.Instant

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

通过
PreparedStatement::setObject
ResultSet::getObject
与数据库交换
Instant

myPreparedStatement.setObject( … , instant ) ;
而且

Instant instant = myResultSet.getObject( … , Instant.class ) ;
要通过UTC以外的其他时区查看此时刻,请应用
ZoneId
以获取
zoneDateTime

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是。