在经历了这么多示例一周后,从 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());
}
缺口。