Joda DateTime,格式化和Mysql时间戳

时间:2013-08-23 18:26:42

标签: java datetime

经过一周的例子,并从Java Date转移, 到日历,到Joda。我决定寻求其他来源的帮助。

问题:

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

另一个要求是使用正确的Object(Date,DateTime等)。 并且不传递日期的字符串表示。最好的 是一个有效的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时区独立信息和milleseconds?:

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());
}

尼克。

1 个答案:

答案 0 :(得分:4)

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

格式化程序使用格式yyyy-MM-dd HH:mm:ss进行分析,toString() DateTime方法格式化其使用日期(as documented)ISO8601格式(yyyy-MM-ddTHH) :MM:ss.SSSZZ)