我正在尝试以特定格式将日期插入到 SQL 表中。我成功地将日期插入到 datetime
类型的列中,但格式不正确。
我有以下内容:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
df.setTimeZone(tz);
String timeString = df.format(System.currentTimeMillis());
Date date = df.parse(timeString);
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
我可以看到 timeString
被正确设置为如下字符串:“2017-01-11 18:19:06.662
”
但是日期然后被设置为类似:“Wed Jan 11 13:19:06 EST 2017
”(缺少毫秒)
并且 sqlDate
设置为“2017-01-11
”
当我查看表格以查看值是什么时,我看到对于我正在设置的字段,我看到 datetime
设置为“2017- 01-11 00:00:00.000
".
现在缺少所有时间信息,我确定这与 sqlDate
被设置为没有时间的值有关,但我不确定为什么 sql date 有没有时间值(value)。我查看了一些尝试处理相同问题的旧帖子,但没有找到解决方案 here或 here .
欢迎提供关于为什么会发生这种情况的建议。
最佳答案
你的代码似乎是正确的,你只是因为 toString
的实现而感到困惑:
- 在
java.util.Date
中,它以dow mon dd hh:mm:ss zzz yyyy
的形式提供日期。 - 在
java.sql.Date
中,它以yyyy-mm-dd
的形式提供日期。
但是,如果您比较 getTime()
为两者(date
和 sqlDate
)返回的值,您将获得与您返回的值相同的值最初提供给df.format
以获取timeString
。
您的错误更多是您将 java.sql.Date
用作日期时间,因为如 javadoc 中所述:
To conform with the definition of
SQL DATE
, the millisecond values wrapped by ajava.sql.Date
instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.
你应该使用 java.sql.Timestamp
而不是 java.sql.Date
来保持日期的时间部分(小时、分钟、秒和毫秒),正如您所期望的那样。
你的代码应该是:
...
java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());
关于java - 从 Java 将日期插入 SQL Server - 格式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41598393/