Java ResultSet如何以UTC格式获取TimeStamp

kal*_*kal 12 java jdbc

数据库包含UTC数据,当我尝试获取数据时

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

这有什么不对吗?

Sub*_*ubu 30

java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal); 
Run Code Online (Sandbox Code Playgroud)

这应该做的伎俩!

  • @arahant,如果底层数据库存储时区(不是时间戳)信息,则没有问题,因为时间戳将在正确的时区.问题是当时间戳以UTC存储而没有时区信息时,因为Java将使用本地机器的时区来构造时间戳对象. (3认同)
  • 这应该被标记为正确的答案;) (2认同)
  • (很晚了)警告!这种方法会浪费你的毫秒 - http://stackoverflow.com/a/24081377/609452 另外,如果你是多线程的,请确保你不要尝试通过共享时区日历来“优化” - 出于某种扭曲的原因,实现修改日历来构建回复 (2认同)

akf*_*akf 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()));
Run Code Online (Sandbox Code Playgroud)

编辑:你的评论:

如果我使用GMT怎么办,那将是SimpleDateFormat中的一个问题

SimpleDateFormat可以使用通用时区(GMT +/- n),RFC822和文本("如果它们有名称"作为JavaDoc状态 - 请参阅此帖子以获取有关名称的信息).