如何在 Java 的预期时区中检索 oracle Timestamp 列?
Posted
技术标签:
【中文标题】如何在 Java 的预期时区中检索 oracle Timestamp 列?【英文标题】:How to retrieve oracle Timestamp column in expected timezone in Java? 【发布时间】:2016-06-17 06:12:07 【问题描述】:我在 oracle 表中有一个时间戳列。在存储时间时,我将它存储在此列中的 UTC 中。为了检索这个时间戳,我使用 Spring 的 JdbcTemplate 同时返回 TimeStamp 类型的对象。
我想在当前时区以“dd-MM-YYYY HH:mm:ss”格式获取日期时间字符串。为了实现这一点,我正在尝试以下代码:
new LocalDateTime(<retrieved TimeStamp>, <current user DateTimeZone>).toString("yyyy-MM-dd HH:mm:ss")
来自 Joda 库的 LocalDateTime 和 DateTimeZone。
这并没有按预期工作。上面的代码不是当前用户的时区,而是只给我 UTC 格式的日期时间字符串。
我错过了什么?
【问题讨论】:
您在此处实例化的 LocalDateTime 的完全限定类名是什么?我找不到任何与您正在做的事情相似的文档。 我的错。更新了描述。它来自 Joda 图书馆。 【参考方案1】:我认为您的应用程序正在使用没有时区信息的java.util.Date
,toString
用法在创建字符串时应用了 JVM 当前的默认时区。
您可以通过 (Using Joda Library) 调整时区瞬间
ZonedDateTime Tokyo = ZonedDateTime.ofInstant (instant,zoneIdTokyo) ;
或实施区域
DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo");
您正在使用
LocalDateTime
是表示本地日期和时间(无时区)
编辑 - 你可以试试这个 (我没有测试过)
DateTime udate = new DateTime("2016-05-01T20:10:04", DateTimeZone.UTC);
System.out.println(udate);
DateTime zone = udate.plusMillis(10000)
.withZone(DateTimeZone.forID("Asia/Kolkata"));
System.out.println(zone);
【讨论】:
如果您能提供小代码 sn-p 将 Timestamp 对象转换为格式化字符串,我将不胜感激。【参考方案2】:在从数据库中获取时间戳时添加 utc 日历,以便 jdbc 驱动程序可以使用这个日历时区而不是默认的系统时区。
//Assign utc calendar
Calendar utc= Calendar.getInstance();
utc.setTimeZone(TimeZone.getTimeZone("UTC"));
Timestamp timestamp = rs.getTimestamp("timestampcolumn", utc);
//Convert to client date time
DateTime dateTime = new DateTime(timestamp.getTime(), DateTimeZone.forID("Asia/Kolkata"));
//Format
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss");
//Change to client wall clock time
LocalDateTime localDateTime = dateTime.toLocalDateTime();
String formattedlocalDateTime = formatter.print(localDateTime)
示例
String utcTime = "2016-06-17 14:22:02Z";
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ");
DateTime dateTime = parser.parseDateTime(utcTime).withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss");
System.out.println(dateTime);
LocalDateTime localDateTime = dateTime.toLocalDateTime();
String formattedlocalDateTime = formatter.print(localDateTime);
System.out.println(formattedlocalDateTime);
【讨论】:
这种方法是否为您提供正确时区的日期时间?我试过了,但问题仍然存在。 用示例更新了答案。你可以输入你的价值观,看看它是否适合你, 对于相同的代码,我在我的机器上得到以下值:时间戳:2016-06-17 09:33:25.0,日期时间:2016-06-17T09:33:25.000+05:30, localDateTime:2016-06-17T09:33:25.000,formatter.print(localDateTime):17-06-2016 09:33:25。我使用“亚洲/加尔各答”作为时区。 更新了答案以包含 UTC 日历。 在检索时间戳的同时传递 utc 日历解决了这个问题。以上是关于如何在 Java 的预期时区中检索 oracle Timestamp 列?的主要内容,如果未能解决你的问题,请参考以下文章