Java 和 MySQL 时区问题



我正在尝试将java中的字符串日期值转换为date,并尝试将其存储在mysql表中。

代码片段下方:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String string = "07/24/2013 17:57:52 UTC";
Date a = dfm.parse(string);
System.out.println(a);

我的问题是,上面的代码总是返回以下控制台输出:2013年7月24日星期三17:57:52太平洋夏令时

我不知道为什么时区会发生变化,更多的是当我试图将其放入数据库时,它会以"2013-07-24 17:57:52"的格式存储它。我不确定为什么上面的代码会在PDT中返回我的时区?

你们能解释一下吗?我的意图是存储一个UTC日期,该日期将作为输入,并将其存储到MySQL时间戳字段中。

提前感谢。

好吧,如果你可以将字符串固定为不包括时区,那就更简单了。首先,您需要了解Date对象根本不包含时区——它只是一个时间点。

接下来,当我们试图解析以UTC指定的日期/时间时,您应该在SimpleDateFormat:中设置它

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
dfm.setTimeZone(TimeZone.getTimeZone("UTC"));

现在,我希望JPA能做正确的事情。您至少可以将正确的值传递给Timestamp构造函数。

然而,MySQL文档的这一部分让我感到紧张:

MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,并将其从UTC转换回当前时区进行检索。(其他类型(如DATETIME)不会出现这种情况。)

听起来您可能需要使用DATETIME字段来停止此时区转换。当存储时,将连接的时区设置为UTC会有所帮助,但您仍然需要担心获取时会发生什么。(IMO,当涉及到日期/时间类型时,数据库非常混乱。这只是另一个例子……)另一方面,如果你也用Java取回数据,我希望它能透明地工作。也许至少值得一试。。。

您的格式字符串中缺少时区部分。因此忽略"UTC"。试试这个:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); // added "z"
// then the rest of your code as-is
String string = "07/24/2013 17:57:52 UTC";
Date a = dfm.parse(string);
System.out.println(a); // prints "Wed Jul 24 19:57:52 CEST 2013" for me

除了@JonSkeet的警告,MySQL的"当前时区"可以通过time_zone会话变量进行检查或更改。

请确保您的会话设置为UTC(SET time_zone = '+0:00'),或者使用DATETIME类型。

相关内容

  • 没有找到相关文章

最新更新