数据库获取时间的时区问题以及getTimestamp和getDate的坑

今天程序中需要用到对数据库时间的获取,数据库在美国,用的是UTC时区,客户端在中国,用的时GMT+8时区,但是发现用getTime和getTimestamp时候获取日期时得到的时间不一致。于是就看了下JDBC的源码了解了这个Bug或者说Feature的原理。
就是getTimestamp这个函数比如在数据库连接的url里面加入useTimezone = true这个参数才可以转换时区,否则传入的时区参数是无效的。然而getDate这个函数,是数据库连接的url里设置的时区对它都是无效的,需要再单独传入时区参数才可以

#
详细可以参考官方文档,比如Mysql的官方文档
在数据库url中会有一些参数,其中关于时区的有如下三个:

serverTimezone
useTimeZone
useLegacyDatetimeCode

serverTimezone是用来服务器时区的【如果不设置就选择服务器的默认时区】
useTimeZone是用来设置时区转换的,当其为true时,就会开启服务器和客户端之间的时区转换,而其只有当useLegacyDatetimeCode = true时才回生效

useLegacyDatetimeCode这个参数是一个开关参数,默认为true,但是当其设置为false时,"useTimezone," "useJDBCCompliantTimezoneShift," "useGmtMillisForDatetimes," and "useFastDateParsing."这几个参数都会变的无效化。

getTimestamp函数中,其中在最开始会传入一个时区的参数,

public Timestamp getTimestamp(int colum
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JSP中,我们可以使用Java语言的Date和Calendar类以及JDBC来实现现在时间和数据库时间的比较。 第一步,我们需要通过Java的内置Date类获取当前的系统时间。可以使用以下代码实现: ``` Date now = new Date(); ``` 第二步,我们需要从数据库中获取对应的时间。我们可以通过JDBC连接到数据库,并执行查询语句获取数据库中的时间数据。具体的代码可以参考如下: ``` Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 连接到数据库 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDB"; String username = "root"; String password = "123456"; conn = DriverManager.getConnection(url, username, password); // 执行查询语句获取数据库中的时间数据 stmt = conn.createStatement(); String sql = "SELECT datetime_column FROM table_name"; rs = stmt.executeQuery(sql); // 获取数据库中的时间数据 if (rs.next()) { Date dbTime = rs.getTimestamp("datetime_column"); // 进行时间比较 if (now.after(dbTime)) { // 现在时间晚于数据库时间 System.out.println("现在时间晚于数据库时间"); } else if (now.before(dbTime)) { // 现在时间早于数据库时间 System.out.println("现在时间早于数据库时间"); } else { // 现在时间和数据库时间相等 System.out.println("现在时间和数据库时间相等"); } } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭数据库连接 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } ``` 上述代码中,我们使用了`java.sql.Date`和`java.sql.Timestamp`类来处理数据库中的日期时间数据。同时,我们使用了`after()`、`before()`等方法来进行时间比较。 总结起来,我们可以通过获取当前系统时间和从数据库中查询的数据时间进行比较来判断现在时间和数据库时间的关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值