java - 从数据库获取 GMT 时间后更改时区 - MonetDB

标签 java jdbc timezone timestamp monetdb

我有包含用户表的表的 MonetDB 数据库:

CREATE TABLE user
(
    birth_date TIMESTAMP NOT NULL
);

birth_date 以 GMT 格式保存,不带 DST。 (这是 MonetDB 的默认行为)。所以我应该在我的应用程序中更改 TimeZone。这是我的代码:

Class.forName("nl.cwi.monetdb.jdbc.MonetDriver");
Connection con = DriverManager.getConnection("jdbc:monetdb://localhost/online", "monetdb", "monetdb");      
Statement st = con.createStatement();
ResultSet rs;

rs = st.executeQuery("SELECT * FROM user");
while (rs.next()) {
    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran"));
    c.setTime(rs.getTimestamp("birth_date"));
    System.out.println(c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH) + " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND));
}

但是这段代码在数据库中打印了相同的TIMESTAMP。这是转换 TimeZone 的错误方法吗?我在带有 openjdk 6 的 Debian 6 上使用 MonetDB 版本 11.9.5-20120516。这是 monetdbd getall/home/dbfarm:

dbfarm           /home/dbfarm/
status           monetdbd[4187] 1.6 (Apr2012-SP1) is serving this dbfarm
mserver          /usr/bin/mserver5
logfile          /home/dbfarm//merovingian.log
pidfile          /home/dbfarm//merovingian.pid
sockdir          /tmp
port             50000
exittimeout      60
forward          proxy
discovery        yes
discoveryttl     600
control          yes
passphrase       {SHA512}ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
mapisock         /tmp/.s.monetdb.50000
controlsock      /tmp/.s.merovingian.50000

最佳答案

终于找到答案了。

MonetDB 默认在 GMT 运行,因为 Asia/Tehran 在数据库配置中不可用,所以我需要将时间转换为 Asia/Tehran 我的应用程序中的时区。 JVM 从操作系统获取其默认的 TimeZone,而我的操作系统设置为 Asia/Tehran。因此,该程序默认在 Asia/Tehran 中运行,在代码中再次将其更改为“Asia/Tehran”并没有任何好处。我所做的是:

  1. 在应用程序启动时将 JVM 的默认 TimeZone 更改为 UTC
  2. 从数据库中检索记录
  3. TimeZone 更改为 Asia/Tehran

代码如下:

/* Change the default TimeZone of JVM */
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
Calendar c = Calendar.getInstance();
Class.forName("nl.cwi.monetdb.jdbc.MonetDriver");
Connection con = DriverManager.getConnection("jdbc:monetdb://localhost/online", "monetdb", "monetdb");
Statement st = con.createStatement();
ResultSet rs;
rs = st.executeQuery("SELECT * FROM user");
/* In each iteration:
 * 1. set TimeZone to UTC
 * 2. fetch record
 * 3. convert to Asia/Tehran and so on ... */
while (rs.next()) {
    c.setTimeZone(TimeZone.getTimeZone("UTC"));
    c.setTime(rs.getTimestamp("birth_date"));
    System.out.println(c); /* This is original values in the database */
    c.setTimeZone(TimeZone.getTimeZone("Asia/Tehran"));
    System.out.println(c); /* This is the values I'm looking for */
}

请注意,如果没有 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));,这将不起作用。因为 JDBC 已连接到数据库并将时间转换为 JVM 的默认 TimeZone(在本例中为 Asia/Tehran),然后才能进行任何转换。

关于java - 从数据库获取 GMT 时间后更改时区 - MonetDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10772901/

相关文章:

c# - TimeZoneInfo 到 TIME_ZONE_INFORMATION 结构

javascript - Moment js在特定时区创建日期时间

java - Smack + openfire - 是否可以检查当前用户是否是管理员?/如何检查当前用户详细信息?

java - Camel : ClassCastException: DefaultMessage cannot be cast to class SnmpMessage

java - 从 url 加载位图太慢

安卓应用程序 : how to display resultset in Listview?

java - Spring Boot 找不到特定于配置文件的属性文件

Java 代码未从 mysql 返回正确的表

java - 如何将 Excel 中的行插入到 mysql 数据库中?

django - 使用 geoip2 查找时区