Java ResultSet如何获取UTC时间戳

14

数据库中的数据采用UTC时区,当我尝试获取数据时

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

这个有什么问题吗?


3
你告诉我们,你是提问者。你实际尝试过了吗?是否没有得到预期结果?如果是的话,你期望得到什么,它给出了什么结果?当你使用数据库自己的查询工具时,数据库会告诉你什么? - kdgregory
1
是的,我尝试过了,但它并没有给出我期望的结果。数据库具有UTC值,而此代码会将+8添加到DB中已有的值。 - kal
1
什么是DB?你尝试过其他的DB吗?你知道resultSet.getTimestamp(PUBLISH_TIME,Calendar.getInstance())这个方法可能吗? - Mohan Narayanaswamy
2个回答

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

这应该能解决问题!


请注意,根据http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp%28int,%20java.util.Calendar%29文档,在底层数据库不存储时间戳信息的情况下才能正常工作。 - arahant
6
如果底层数据库存储时区信息(而不是时间戳),那么就没有问题,因为时间戳将以正确的时区显示。问题在于当时间戳以UTC格式存储且没有时区信息时,Java会使用本地机器的时区来构建时间戳对象。 - Paul
2
(非常晚)警告!这种方法会消耗您的毫秒 - http://stackoverflow.com/a/24081377/609452此外,如果您正在进行多线程操作,请确保不要尝试通过共享时区日历来“优化” - 出于某种扭曲的原因,实现会修改日历以构建回复。 - YMA
如果resultset.updateTimestamp(column, mili)先执行,那么执行resultset.getTimestamp(time, cal)会抛出异常java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]。我已经为此问题苦恼了一段时间。 - Weishi Z
您可以直接实例化一个UTC日历,避免使用setTimeZone方法,代码如下:java.util.Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) - Tim Nieradzik
显示剩余2条评论

6

您的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 所述 - 请参见此帖子了解名称信息)。


如果我使用GMT,SimpleDateFormat会有问题吗? - kal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接