18

我正在尝试使用准备好的语句将包含日期、时间和时区的字符串插入到带有我的数据库的时区字段的时间戳中。

问题是 Timestamp.valueof 函数没有考虑字符串包含的时区,因此会导致错误。接受的格式是 yyyy-[m]m-[d]d hh:mm:ss[.f...] ,其中没有提及时区。

那是导致错误的确切代码:

pst.setTimestamp(2,Timestamp.valueOf("2012-08-24 14:00:00 +02:00"))

有什么办法可以克服吗??提前致谢!

4

2 回答 2

8

基本问题是 java.sql.Timestamp 不包含时区信息。我认为它总是被假定为“本地时区”。

我能想到的解决方案是不在 PreparedStatement 中使用参数,而是在 SQL 中使用时区文字:

update foo
  set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`;

另一种可能的解决方案是将格式正确的字符串传递给使用 to_timestamp() 的 PrepareStatement:

String sql = "update foo set ts_col = to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss')"; 
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "2012-08-24 14:00:00 +02:00");
于 2012-12-03T18:50:52.267 回答
1

我相信您可以在数据库中再使用一个字段,其中包括时区。并在获得这两个字段后手动计算时间

于 2012-12-03T17:55:08.150 回答