2012-05-27 75 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());'工作正常。並打印「亞洲/德黑蘭」。檢查我的答案。 –