当我创建一个新Date对象时,它会初始化为当前时间但在本地时区.如何获得GMT中的当前日期和时间?
通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时,如何获取/转换为java.time对象?
Postgres的开源JDBC驱动程序都没有兼容JDBC 4.2,所以我正在寻找一种方法来使用java.time和JDBC 4.1.
我在where子句中使用带有时间戳的PreparedStatement:
PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?");
s.setTimestamp(1, new Timestamp(1273017600000L)); //2010-05-05 00:00 GMT
s.setTimestamp(2, new Timestamp(1273104000000L)); //2010-05-06 00:00 GMT
ResultSet rs = s.executeQuery();
if(rs.next()) System.out.println(rs.getInt("value"));
Run Code Online (Sandbox Code Playgroud)
当我在客户端计算机上有不同的时区时,我得到的结果是不同的.这是Oracle jdbc中的错误吗?还是纠正行为?
Oracle数据库版本是10.2,我已经尝试使用oracle jdbc瘦驱动程序版本10.2和11.1.
参数是Timestamp,我预计在途中不会进行任何时间转换.数据库列类型是DATE,但我也使用TIMESTAMP列类型检查它,结果相同.
有没有办法达到正确的结果?我无法将整个应用程序中的默认时区更改为UTC.
谢谢你的帮助
我应该使用java.util.Date还是java.sql.Date?
我有一个VisualFox数据库,我使用适当的jdbc类型4驱动程序使用IntelliJ Idea向导检索实体.
ide(或驱动程序)已将日期字段创建为Timestamp.但是,日期字段不是时间戳,而是日期字段,它们仅存储年,月和日.
所以我想知道是否应该切换到java.util.Date或java.sql.Date.乍一看,我认为java.sql.Date应该是适当的,但它有许多声明为弃用的方法.
以下如何使用JPA和Hibernate以UTC时区存储日期/时间和时间戳我想将我的应用程序默认时区设置为UTC.我的应用程序在Linux服务器上运行tomcat和其他一些应用程序.服务器有其他运行更多应用程序的tomcat实例.
Timezone.setDefault(tz)会影响同一个tomcat实例上的其他应用吗?
它会影响其他tomcat实例上的其他应用程序吗?
是否可以仅为应用设置时区?我松散地记得有关安全管理器设置的一些内容.
如何将最初实例化为CST的java.sql.Timestamp对象的时区更改为GMT?
我开发了一个SonarQube插件,为了满足我的一个需求,我需要将项目的分析日期存储为SQL TIMESTAMP(请注意: a TIMESTAMP,而不是 a TIMESTAMP WITH TIMEZONE).
以下是我目前的工作方式:
// In the SonarQube Sensor
// .getAnalysisDate() returns a java.util.Date
final Instant instant = module.getAnalysisDate().toInstant();
// Timestamp at UTC from the Instant
final LocalDateTime dt = LocalDateTime.frominstant(instant, ZoneOffset.UTC);
final Timestampt ts = Timestamp.valueOf(dt);
Run Code Online (Sandbox Code Playgroud)
抓住Instant的概念我有点麻烦,还有ZonedDateTime等......
无论如何,这似乎做我想要的,但这是正确的方法吗?
public static void main(String[] args) {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
Instant instant = Instant.from(zdt);
Timestamp timestamp = Timestamp.from(instant);
System.out.println(ldt + "\n");
System.out.println(zdt + "\n");
System.out.println(instant + "\n");
System.out.println(timestamp + "\n");
}
Run Code Online (Sandbox Code Playgroud)
它打印:
2017-05-07T18:13:26.969
2017-05-07T18:13:26.969-04:00[America/New_York]
2017-05-07T22:13:26.969Z
2017-05-07 18:13:26.969
Run Code Online (Sandbox Code Playgroud)
如何Timestamp在同一时间进行SQL 保存Instant?我需要能够Timestamp从任何地方获取并将其转换为它在世界的任何时间.问题在于它与我的系统时钟恰好设置在同一时间保存.
我有一个时间戳编码为String-例如,"2012-02-12T09:08:13.123456-0400"来自Oracle数据库。
我可以想到的唯一读取此时间戳的方法是使用Timestamp.valueOf(),并且需要一种格式yyyy-[m]m-[d]d hh:mm:ss[.f...]
我坚信这是在不损失精度的情况下读取时间的唯一方法,因为其他方法不支持上述示例中包含的纳秒精度".123456"。
考虑到这一点,我可以简单地修剪所需的值以适合所需的格式。因此,原始字符串将被转换:
"2012-02-12T09:08:13.123456-0400""2012-02-12 09:08:13.123456"如果这样做,我将删除"-0400"时区偏移量。这对我来说是一个危险的信号,直到我看到这篇文章为止。提出的答案之一指出,
我认为正确答案应该是java.sql.Timestamp不是特定于时区的。时间戳是java.util.Date和单独的纳秒值的组合。此类中没有时区信息。因此,就像Date一样,该类仅保留自1970年1月1日00:00:00 GMT + nanos起的毫秒数。
为了向我证明不需要偏移量,我编写了一个简单的集成测试。
将此时间戳插入数据库:中"2015-09-08 11:11:12.123457"。使用Java读取数据库,并打印出详细信息。我得到"2015-09-08 11:11:12.123457",这是相同的值。因为我的JVM和Oracle DB在同一台计算机上运行,所以这没问题。
java.sql.Timestamp吗?我的部分表定义(MySQL)如下所示:
+-----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+----------------+
| ... | ... | .. | ... | ... | ... |
| timestamp | datetime | YES | | NULL | |
| ... | ... | .. | ... | ... | ... |
+-----------+----------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
我想使用 JDBC 更新时间戳字段。假设时间戳是UTC。
在我的 Java 代码中,我按如下方式获取时间戳字段:
Timestamp datetime = new Timestamp(new Date().getTime());
Run Code Online (Sandbox Code Playgroud)
java.util.Date的文档指出:
尽管 Date 类旨在反映协调世界时 (UTC),但它可能不会完全如此,具体取决于 Java 虚拟机的主机环境。
不幸的是,在我的 Windows 10 环境(java …
我在使用jdbc的数据库(firebird)中的时间戳有问题
数据库中的数据
timestamp 1994-10-12T00:00:00.000000000-00:00
Run Code Online (Sandbox Code Playgroud)
我用python测试,结果在数据库中是相同的,但是当我使用jdbc(clojure)时
result is 1994-10-11T17:00:00.000000000-00:00
Run Code Online (Sandbox Code Playgroud)
我认为这取决于时区(我在GMT + 7)
如何解决?
谢谢。
此代码
(ns test.core
(:require [clojure.java.jdbc :as jdbc]))
(def firebird-setting {:description "Firebird Database"
:classname "org.firebirdsql.jdbc.FBDriver"
:subprotocol "firebirdsql"
:subname "//localhost:3051//firebird/data/test.fdb"
:user "user"
:password "pass"})
(jdbc/query firebird-setting
"select ts from TestTB")
Run Code Online (Sandbox Code Playgroud)
和结果
({:ts #inst "1994-10-11T17:00:00.000000000-00:00"})
Run Code Online (Sandbox Code Playgroud) 我遇到一个问题,MySQL 存储的日期时间值与客户端传递的日期时间值不同。服务器以 UTC 运行,而客户端在不同的时区运行。DATE不知何故,MySQL 似乎会在客户端和服务器时区之间转换日期时间值,即使 SQL 类型TIME和TIMESTAMP都没有时区。到目前为止,我测试过的其他数据库都没有这种行为。
以下代码可用于重现该问题。当服务器以 UTC 运行时,代码仅当客户端也以 UTC 运行时才有效。
try (Connection connection = this.dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT ? = DATE '1988-12-25', ? = TIME '15:09:02', ? = TIMESTAMP '1980-01-01 23:03:20'")) {
preparedStatement.setDate(1, java.sql.Date.valueOf("1988-12-25"));
preparedStatement.setTime(2, java.sql.Time.valueOf("15:09:02"));
preparedStatement.setTimestamp(3, java.sql.Timestamp.valueOf("1980-01-01 23:03:20"));
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getBoolean(1));
System.out.println(resultSet.getBoolean(2));
System.out.println(resultSet.getBoolean(3));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在用着
我的 JDBC URL 只是jdbc:mysql://host:port/database
编辑
我为什么时区不应该在这里发挥作用并且不应该发生时区转换的原因有两个。首先,在 SQL 级别上 …