代码之家  ›  专栏  ›  技术社区  ›  Derek Mahar

在将Java日期写入SQL时间戳列之前,JDBC是否将日期从JVM时区转换为数据库会话时区?

  •  25
  • Derek Mahar  · 技术社区  · 14 年前

    在编写Java之前 Date 到SQL TIMESTAMP 列,does JDBC

    例如,假设Java虚拟机时区是 UTC 数据库会话时区是 UTC-5 . 如果Java程序试图存储 2000-01-01 00:00:00 PreparedStatement#setTimestamp(int, Timestamp) ,根据JDBC标准,数据库将存储 TIMESTAMP '2000-01-01 00:00:00' TIMESTAMP '1999-12-31 19:00:00'

    4 回复  |  直到 14 年前
        1
  •  14
  •   Buhake Sindi Tesnep    14 年前

    不, JDBC 只是一个关于客户端如何访问数据库的API。对于时间戳存储,这必须依赖于编写符合JDBC API标准的数据库驱动程序的组织。

    Here's PreparedStatement . 他们似乎把Java的JVM时区带到了MySQL时区(检查 setTimestampInternal() 方法)。

        2
  •  7
  •   Jagat    14 年前

    编辑:

    TimeZone default = TimeZone.getDefault();
    try
    {
      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    
      //Do stuff with JDBC
    }
    finally
    {
      TimeZone.setDefault(default);
    }
    
        3
  •  2
  •   Cezar    12 年前

    可以使用重载 setTimestamp 设定者接受 Calendar 指定时区的实例

    org.joda.time.DateTime sendDateUTC = new DateTime( DateTimeZone.UTC ).withMillis( millis );
    statement.setTimestamp (1, sendDateUTC, sendDateUTC.toGregorianCalendar() );
    

    根据javaDoc: 将指定的参数设置为给定的 java.sql.Timestamp 日历 日历 SQL TIMESTAMP 值,然后驱动程序将其发送到数据库。用一个 日历

    void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal)
        throws SQLException;
    
        4
  •  -1
  •   ChrisG65    11 年前

    规格是高飞。java.util.Date将从epoch开始的毫秒存储在GMT参考框架中。Timestamp是同一参考框架中的日期加纳秒。所有非弃用的getter和setter都使用GMT参考框架。对于任何类型的健全性,存储时间戳的默认时区应为GMT。

    在多层应用程序中,前端、驱动程序和数据库服务器都可能位于不同的时区。其中一些层可能同时位于不同的时区;例如,如果您正在跨大陆进行internet负载平衡,或者如果您有一个移动应用程序连接到中央服务器。云操作环境与您不知道JDBC驱动程序将在何处运行的场景几乎相同,也不知道任何保证将永远不变。