【问题标题】:Java ResultSet how to getTimeStamp in UTCJava ResultSet如何在UTC中获取TimeStamp
【发布时间】:2023-03-17 01:18:02
【问题描述】:

数据库有 UTC 格式的数据,当我尝试获取数据时

java.util.Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME);
cal.setTime(ts);

这有什么问题吗?

【问题讨论】:

  • 您告诉我们,您是提出问题的人。你真的试过了吗?它不会给出您期望的结果吗?如果是,那么你期待什么,它给出的结果是什么?当您使用自己的查询工具时,数据库会告诉您什么?
  • 是的,我试过了,是的,它没有给出我期望的结果。数据库具有 UTC 值,此代码进一步将 +8 添加到 DB 中已有的值。
  • 什么是数据库?您是否尝试过使用其他数据库?你知道 resultSet.getTimestamp(PUBLISH_TIME,Calendar.getInstance());可能吗?

标签: java jdbc


【解决方案1】:
java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal); 

这应该可以解决问题!

【讨论】:

  • 请注意,根据docs.oracle.com/javase/6/docs/api/java/sql/… 的文档,这仅在底层数据库不存储时间戳信息时才有效
  • @arahant,如果底层数据库存储时区(不是时间戳)信息,那么没有问题,因为时间戳将位于正确的时区。问题是当时间戳存储在没有时区信息的 UTC 中时,因为 Java 将使用本地机器的时区来构造时间戳对象。
  • (很晚)警告!这种方法会杀死你的毫秒 - stackoverflow.com/a/24081377/609452 另外,如果你是多线程的,请确保你不要尝试通过共享时区日历来“优化” - 由于某种扭曲的原因,实现会修改日历来构造回复
  • 如果resultset.updateTimestamp(column, mili) 先然后resultset.getTimestamp(time, cal) 抛出java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 。一段时间以来一直在努力解决这个问题。
  • @paul 如果数据库服务器上没有设置时区,并且我们没有在 rs.getTimestamp 中传递日历作为第二个参数,会发生什么情况。 db 列中的时间戳会被视为 UTC 吗?
【解决方案2】:

您的 DateFormat 实例很可能以当地时间显示该值。显示您的价值时,请尝试一下:

java.util.Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME);
cal.setTime(ts);

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(cal.getTime()));

编辑:对您的评论:

如果我使用 GMT,那会是 SimpleDateFormat 中的一个问题

SimpleDateFormat 可以使用通用时区 (GMT +/- n)、RFC822 和文本(如 JavaDoc 所述,“如果他们有名称” - 请参阅 this post 了解有关名称的信息)。

【讨论】:

  • 如果我使用 GMT,SimpleDateFormat 会出现问题
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 2014-10-10
  • 2021-11-09
  • 1970-01-01
  • 2014-02-15
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多