将java.util.Date转换为java.sql.Date会截断时间部分
我正在尝试使用JDBC将应用程序中的将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
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及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是。