2012-05-27 58 views
0

我MonetDB数据库表中包含用户表:更改时区 - MonetDB

CREATE TABLE user 
(
    birth_date TIMESTAMP NOT NULL 
); 

birth_date保存在格林尼治标准时间没有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?我使用MonetDB版本11.9.5-20120516在Debian 6 OpenJDK的6这里是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 

回答

0

最后我得到了答案。

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

  1. 当应用程序启动时,将JVM的默认TimeZone更改为UTC
  2. 检索记录从数据库
  3. 变化TimeZoneAsia/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),然后才能进行任何转换。

1

你是如何确定从monetdb回来的时候?

我使用下面的代码,它使用的是Date而不是java.sql.Timestamp,它适当地从一个时区转换到另一个时区,那么是否有可能自动将时间从UTC转换为本地时间?

Date d = new Date(); 
    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tehran")); 
    c.setTime(d); 
    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)); 
    c.setTimeZone(TimeZone.getTimeZone("UTC")); 
    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)); 

编辑如果配置错误你的java,试图让该时区可能会失败;产生在同一时区为GMT输出,所以你应该始终确保你得到正确的时区

TimeZone tz = TimeZone.getTimeZone("Asia/Tehran"); 
System.out.println(tz.toString()); 

显示sun.util.calendar.ZoneInfo[id="Asia/Tehran",offset=12600000,dstSavings=3600000,useDaylight=true,transitions=100,lastRule=java.util.SimpleTimeZone[id=Asia/Tehran,offset=12600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=2,startDay=21,startDayOfWeek=0,startTime=0,startTimeMode=0,endMode=1,endMonth=8,endDay=21,endDayOfWeek=0,endTime=0,endTimeMode=0]]我;同时:

TimeZone tz = TimeZone.getTimeZone("Asia/fred"); 
System.out.println(tz.toString()); 

显示sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

+0

问题是时代不会改变。在应用程序中转换时区后,数据库中的记录相同。 –

+0

Java的实例有可能无法确定亚洲/德黑兰时区吗?即类似的东西:'TimeZone tz = TimeZone.getTimeZone(“亚洲/德黑兰”); System.out.println(tz.toString());'输出? – Petesh

+0

'TimeZone tz = TimeZone.getTimeZone(“Asia/Tehran”); System.out.println(tz.toString());'工作正常。并打印“亚洲/德黑兰”。检查我的答案。 –