当前位置: 首页 > 知识库问答 >
问题:

Java MySQL时间戳时区问题

宿文栋
2023-03-14
java.util.Date date = myDateFromSomewhereElse;
PreparedStatement prep = con.prepareStatement(
    "INSERT INTO table (t1, t2) VALUES (?,?)");

java.sql.Timestamp t = new Timestamp(date.getTime());
prep.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("PST"));
prep.setTimestamp(2, t, Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(prep.toString());

它给出了准备好的SQL语句字符串:

INSERT INTO table (t1, t2) VALUES ('2012-05-09 11:37:08','2012-05-09 11:37:08');

无论我指定的时区如何,返回的时间戳都是相同的时间戳。它忽略了我指定的带有时区的Calendar对象。这是怎么回事,我做错了什么?

共有1个答案

单于旭东
2023-03-14

乔丹,其实你的想法是对的。问题是MySQL JDBC驱动程序中有一个bug,默认情况下完全忽略了日历参数。请查看PreparedStatement的源代码,以真正了解发生了什么。

注意,它的格式是使用JVM时区的时间戳。只有当您的JVM使用UTC时区时,这才会起作用。Calendar对象被完全忽略。

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss''", Locale.US);
timestampString = this.tsdf.format(x);

为了让MySQL使用Calendar参数,您必须使用以下连接选项禁用遗留的日期/时间代码

useLegacyDatetimeCode=false
String url = "jdbc:mysql://localhost/tz?useLegacyDatetimeCode=false"
if (targetCalendar != null) {
    targetCalendar.setTime(x);
    this.tsdf.setTimeZone(targetCalendar.getTimeZone());

     timestampString = this.tsdf.format(x);
} else {
    this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
    timestampString = this.tsdf.format(x);
}
 类似资料:
  • 问题内容: 一些背景: 我有一个在Tomcat 7上运行的Java 1.6 Webapp。数据库是MySQL 5.5。以前,我使用Mysql JDBC驱动程序5.1.23连接到数据库。一切正常。我最近升级到Mysql JDBC驱动程序5.1.33。升级后,Tomcat将在启动应用程序时引发此错误。 为什么会这样呢? 问题答案: 显然,要使MySQL JDBC驱动程序的5.1.33版与UTC时区一起

  • 假设我有一个时间戳值。 编辑 现在我正在使用获取上述时间的毫秒值; 根据Java文档,getTime()方法的定义是

  • 返回我女巫是错误的。 但接下来的查询如下: 我看对日期

  • 本文向大家介绍sqlite时间戳转时间语句(时间转时间戳),包括了sqlite时间戳转时间语句(时间转时间戳)的使用技巧和注意事项,需要的朋友参考一下 下面是具体的实现代码:

  • 我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。 对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。

  • 然后将变量持久化到MySQL表列中。 然而,虽然通过调试,我看到对象显示在正确的时区GMT+1,但在数据库上持久化时,它是一个GMT时区,所以要追溯一个小时。 使用函数返回一个GMT+1日期。 连接字符串为,没有任何参数。 编辑:找到这段代码