0

我正在尝试将java中的字符串日期值转换为日期并尝试将其存储在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);

我的问题是上面的代码总是返回以下控制台输出: Wed Jul 24 17:57:52 PDT 2013

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

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

提前致谢。

4

2 回答 2

1

对,如果您可以将字符串修复为不包含时区,那就更简单了。首先,您需要了解一个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 取回数据,我希望它只会透明地工作。至少值得尝试一下...

于 2013-08-13T14:42:38.533 回答
0

您在格式字符串中缺少时区部分。因此“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 的警告,可以通过time_zonesession 变量检查或更改 MySQL“当前时区”。

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

于 2013-08-13T14:51:20.773 回答