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

Java 从数据库获取GMT时间后更改时区-MonetDB,java,jdbc,timezone,timestamp,monetdb,Java,Jdbc,Timezone,Timestamp,Monetdb,我有一个MonetDB数据库,其表包含用户表: CREATE TABLE user ( birth_date TIMESTAMP NOT NULL ); 出生日期以GMT格式保存,不带DST。(这是MonetDB的默认行为)。因此,我应该更改应用程序中的时区。这是我的密码: Class.forName("nl.cwi.monetdb.jdbc.MonetDriver"); Connection con = DriverManager.getConnection("jdbc:monetd

我有一个MonetDB数据库,其表包含用户表:

CREATE TABLE user
(
    birth_date TIMESTAMP NOT NULL
);
出生日期
以GMT格式保存,不带DST。(这是MonetDB的默认行为)。因此,我应该更改应用程序中的
时区。这是我的密码:

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));
}
但此代码在数据库中打印相同的
时间戳。这是转换时区的错误方法吗?我在Debian6和OpenJDK6上使用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返回的时间

我使用了以下代码,它使用的是
日期
,而不是
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”,偏移量=12600000,DSTSAVAINGS=3600000,useDaylight=true,transitions=100,lastRule=java.util.SimpleTimeZone[id=Asia/Tehran,offset=12600000,dststavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=2,startDay=21,startDayOfWeek=0,startDayOfWeek=0,startDayOfWeek=0,startTime=0,startTimeMode=0,endMode=1,endMonth=8,endDayOfWeek=21,endDayOfWeek=0]

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

显示
sun.util.calendar.ZoneInfo[id=“GMT”,偏移量=0,DSTSAVENCE=0,useDaylight=false,转换次数=0,lastRule=null]

您如何确定从monetdb返回的时间

我使用了以下代码,它使用的是
日期
,而不是
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”,偏移量=12600000,DSTSAVAINGS=3600000,useDaylight=true,transitions=100,lastRule=java.util.SimpleTimeZone[id=Asia/Tehran,offset=12600000,dststavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=2,startDay=21,startDayOfWeek=0,startDayOfWeek=0,startDayOfWeek=0,startTime=0,startTimeMode=0,endMode=1,endMonth=8,endDayOfWeek=21,endDayOfWeek=0]

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

显示
sun.util.calendar.ZoneInfo[id=“GMT”,偏移量=0,DSTSAVIES=0,使用日光=false,转换=0,lastRule=null]
最后我得到了答案

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

  • 当应用程序启动时,将JVM的默认时区更改为UTC
  • 从数据库中检索记录
  • 时区更改为
    亚洲/德黑兰
  • 以下是代码:

    /* 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
    ),然后才能进行任何转换。

    最后我得到了答案

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

  • 当应用程序启动时,将JVM的默认时区更改为UTC
  • 从数据库中检索记录
  • 时区更改为
    亚洲/德黑兰
  • 以下是代码:

    /* 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实例是否可能无法确定亚洲/德黑兰时区?例如:
    timezone tz=timezone.getTimeZone(“亚洲/德黑兰”);System.out.println(tz.toString());
    output?
    TimeZone tz=TimeZone.getTimeZone(“亚洲/德黑兰”);System.out.println(tz.toString());
    工作正常。并打印
    亚洲/德黑兰
    。请检查我的答案。问题是时间不会改变。在应用程序中转换时区后,数据库中的记录是相同的。是否可能您的java实例无法确定亚洲/德黑兰时区?例如:
    时区tz=timezone.gettimezonne(“亚洲/德黑兰”);System.out.println(tz.toString());
    output?
    TimeZone tz=TimeZone.getTimeZone(“亚洲/德黑兰”);System.out.println(tz.toString());
    工作正常。打印
    亚洲/德黑兰
    。检查我的答案。