【问题标题】:Inserting date into SQL server from Java - not formatting properly从 Java 将日期插入 SQL 服务器 - 格式不正确
【发布时间】:2017-05-26 16:30:12
【问题描述】:

我正在尝试以特定格式将日期插入到 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 日期没有时间值。我查看了一些尝试处理相同问题的旧帖子,但没有找到解决方案 herehere

感谢您就为什么会发生这种情况提出建议。

【问题讨论】:

  • 您缺少格式中的时区设置。尝试将其包含在掩码中并以这种方式设置
  • 列的表定义是什么?

标签: java sql-server date datetime


【解决方案1】:

您的代码似乎是正确的,您只是因为toString的实现而感到困惑:

  1. java.util.Date 中以dow mon dd hh:mm:ss zzz yyyy 形式提供日期。
  2. java.sql.Date 中,将日期提供给yyyy-mm-dd

但是,如果您比较 getTime() 为两者(datesqlDate)返回的值,您将获得与最初提供给 df.format 以获得 timeString 的值相同的值。


您的错误更多是您使用java.sql.Date 作为日期时间,因为如 javadoc 所述:

为了符合SQL DATE的定义,毫秒值 由java.sql.Date 实例包裹的必须通过设置'规范化' 将小时、分钟、秒和毫秒归零 实例关联的特定时区。

您应该使用java.sql.Timestamp 而不是java.sql.Date 来保持您期望的日期的时间部分(小时、分钟、秒和毫秒)。

你的代码应该是:

...
java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());

【讨论】:

  • 感谢您的成功!也谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多