Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.Timestamp有一个时区_Java_Jdbc_Timestamp_Timezone_Java Time - Fatal编程技术网

java.sql.Timestamp有一个时区

java.sql.Timestamp有一个时区,java,jdbc,timestamp,timezone,java-time,Java,Jdbc,Timestamp,Timezone,Java Time,我读到的所有东西都说时间戳是UTC,没有偏移量或时区。但是,我99%肯定MS Sql Server JDBC正在从数据库中读取值并将其设置在本地时区 LocalDateTime localDT = timestamp.toLocalDateTime(); odt = localDT.atOffset(ZoneOffset.UTC); 更新:请不要引用可能重复的问题,该问题询问如何使用UTC datetime设置时间戳。我的问题是如何从数据库中读取UTC时间戳值 调试器显示作为Gregorian

我读到的所有东西都说时间戳是UTC,没有偏移量或时区。但是,我99%肯定MS Sql Server JDBC正在从数据库中读取值并将其设置在本地时区

LocalDateTime localDT = timestamp.toLocalDateTime();
odt = localDT.atOffset(ZoneOffset.UTC);
更新:请不要引用可能重复的问题,该问题询问如何使用UTC datetime设置时间戳。我的问题是如何从数据库中读取UTC时间戳值

调试器显示作为GregorianCalendar对象持有的对象,该对象的时区为Denver


这似乎解决了问题。我猜当它返回LocalDateTime时,它不使用时区

LocalDateTime localDT = timestamp.toLocalDateTime();
odt = localDT.atOffset(ZoneOffset.UTC);

根据@Ole V.V.的建议更新。

日期
中的某处隐藏了一些时区信息,其中
时间戳
是一个子类,因此它也适用于该类。它不会影响时间戳的任何可观察行为,所以我认为“有”一个时区是不正确的。在任何情况下,该类的设计都很糟糕,而且很早就过时了,因此您不应该使用它,因此不必关心它是否有时区。时间线处理很混乱,这取决于数据库设置、会话时区和本地时区(因为
Timestamp
java.util.Date
的子类)(当然还有数据类型)。它随驱动程序而变化。使用
getTimestamp(x,utccal)确实有帮助
指定所需时区的变量JDBC规范要求在使用
java.sql.timestamp
时在当前时区解释时间戳,除此之外,
java.sql.timestamp.toString()的实现
将打印当前时区中的值。@OleV.V.这是我们提供给客户的库。因此,我们必须使用旧的JDBC驱动程序运行,因为我们的一些客户仍在使用它们。由于mssql JDBC,驱动程序支持使用
rs.getObject(n,java.time.LocalDateTime.class)直接检索LocalDateTime
而不是
rs.getTimestamp(n)
(我为此编写了)。如果出于遗留原因需要继续使用getTimestamp,那么请注意遵守夏令时(又称夏季时间)的时区的“损失小时”问题。例如,您无法在
美国/丹佛
中检索
2019-03-10T02:00:00
,因为它从未在该特定时区发生过。