2

在经历了这么多示例一周后,从 Java Date 到 Calendar,再到 Joda。我决定寻求其他来源的帮助。

问题:

我们的表有两个字段 Date(时间戳)和 TZ(字符串)。这个想法是将用户的 UTC 存储在时间戳和时区中,嗯,你明白了。所以基本上我们在 UTC 中思考,并在前端向用户展示转换为他们的时区的时间(即,使用 table.TZ 中的值存储)

另一个要求是使用正确的对象(日期、日期时间等)。并且不传递日期的字符串表示形式。最好的方法是一个有效的 Long ,它将被 MySQL 正确翻译,而不必在我们的查询中使用 FROM_UNIXTIME mysql 函数。

我们正在使用的代码:

public DateTime convertTimezone(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withLocale(l);

DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);

System.out.println(formatter.print(dstDateTime));
System.out.println(formatter.parseDateTime(dstDateTime.toString()));


return formatter.parseDateTime(formatter.print(dstDateTime));
}

字符串输出正是我们所需要的(即 UTC 时间,2013-08-23 18:19:12),但是formatter.parseDateTime(dstDateTime.toString()由于以下错误而崩溃。可能是因为 UTC 时区独立信息和毫秒?:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "2013-08-    23T18:19:12.515Z" is malformed at "T18:19:12.515Z"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:873)
at com.example.business.rate.RateDeck.convertTimezone(RateDeck.java:75)
at com.example.business.rate.RateDeck.WriteData(RateDeck.java:143)
at com.example.business.rate.RateDeck.main(RateDeck.java:64)

搜索引擎丰富的问题​​:

如何为 Joda DateTime 格式化 UTC。

PS我的第一个SO帖子,感觉不错?:)

提前致谢,

新的固定版本:

public Timestamp convertTimezone(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) {
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
return new Timestamp(dstDateTime.getMillis());
}

缺口。

4

1 回答 1

4

它只是崩溃,因为解析字符串的格式与格式化程序的格式不匹配。

格式化程序使用格式进行解析yyyy-MM-dd HH:mm:ss,并使用 ISO8601 格式 (yyyy-MM-ddTHH:mm:ss.SSSZZ)格式化日期的toString()方法(如文档所述)。DateTime

于 2013-08-23T21:16:12.000 回答