如何在 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.DatetoString 用法在创建字符串时应用了 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 列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中使用日光将日期格式从一个时区转换为另一种时区[重复]

Oracle sql查询需要根据时区变化

使用 Shiny 时如何检索客户端的当前时间和时区?

如何在 oracle 触发器中转换日期类型变量的时区

从 Oracle 存储过程中检索数组列表 - Java

如何正确地将时区设置为 UTC,以便以这种格式正确保存和检索所有时间戳?