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

10 浏览
0 Comments

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

在将Java的Date写入到SQL的TIMESTAMP列之前,JDBC会将日期从Java虚拟机的时区转换成数据库会话的时区吗?

例如,假设Java虚拟机的时区是UTC,数据库会话的时区是UTC-5。如果一个Java程序尝试通过将其传递给PreparedStatement#setTimestamp(int, Timestamp)来存储2000-01-01 00:00:00,根据JDBC的标准,数据库会存储TIMESTAMP '2000-01-01 00:00:00'还是TIMESTAMP '1999-12-31 19:00:00'?

0
0 Comments

JDBC在将Java日期写入SQL TIMESTAMP列之前,是否会将日期从JVM时区转换为数据库会话时区?这个问题的出现是因为不同的数据库驱动程序在实现JDBC API时采用了不同的方法。MySQL的JDBC驱动程序在实现中使用Java的JVM时区转换为MySQL时区。而PostgreSQL的JDBC驱动程序在实现中使用JVM时区转换给定的日期。因此,处理时区是取决于具体的JDBC驱动程序的。

Oracle的PreparedStatement如何工作?这取决于具体的JDBC驱动程序的实现。不同的数据库驱动程序可能会有不同的处理方式。

解决方法是根据具体的需求选择合适的数据库驱动程序,并在使用之前进行详细的测试和验证。

0
0 Comments

在Java中,我们经常需要将一个Java Date对象写入到SQL TIMESTAMP列中。然而,JDBC在执行这个操作时,会将Java Date对象从JVM的时区转换成数据库会话的时区。这可能会导致一些问题,因为我们可能希望在数据库中存储的时间是以特定的时区表示的,而不是JVM的默认时区。

为了解决这个问题,JDBC提供了一个重载的setTimestamp方法,可以接受一个Calendar实例参数来指定时区。通过使用这个方法,我们可以将Java Date对象转换成特定时区的SQL TIMESTAMP值,并将其存储到数据库中。

以下是一个示例代码,如果你使用的是Joda datetime库,你可以按照以下方式使用setTimestamp方法来指定时区:

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

根据Java文档的说明,setTimestamp方法的原型如下:

void setTimestamp(int parameterIndex, java.sql.Timestamp x, Calendar cal) throws SQLException;

这个方法将指定的参数设置为给定的java.sql.Timestamp值,并使用给定的Calendar对象来构造一个SQL TIMESTAMP值,然后将该值发送给数据库。通过使用Calendar对象,驱动程序可以根据自定义的时区计算时间戳。如果没有指定Calendar对象,驱动程序将使用默认时区,即运行应用程序的虚拟机的时区。

通过使用带有Calendar参数的setTimestamp方法,我们可以确保将Java Date对象正确地转换为特定时区的SQL TIMESTAMP值,并将其存储到数据库中。这样,我们就可以在数据库中正确地表示和存储不同时区的时间。

0
0 Comments

在使用JDBC将Java Date写入SQL TIMESTAMP列之前,JDBC会将日期从JVM时区转换为数据库会话时区吗?这个问题的出现是因为开发者的要求是无论JVM的时区是什么,都应该将值存储为GMT/UTC。那么有没有一种方法可以动态设置时区,然后在使用JDBC结束后取消设置呢?

原文提到了一种解决方案,即在使用JDBC之前将默认时区设置为UTC,然后在使用完JDBC之后恢复默认时区。具体步骤如下:

TimeZone default = TimeZone.getDefault();
try
{
  TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  //使用JDBC进行操作
}
finally
{
  TimeZone.setDefault(default);
}

需要注意的是,如果其他线程在同一时间对日期进行计算,并且假设默认时区不是UTC,则可能会出现竞争条件。同时,需要注意更改默认时区是一项有风险的操作,它会影响到JVM中所有线程中的所有代码,而不仅仅是方法中的本地代码。

在使用JDBC将Java Date写入SQL TIMESTAMP列之前,JDBC会将日期从JVM时区转换为数据库会话时区。如果要将值存储为GMT/UTC,可以通过动态设置默认时区为UTC来实现,并在使用完JDBC后恢复默认时区。需要注意更改默认时区是有风险的操作,可能会引发竞争条件,影响到JVM中所有线程的代码。

0