Java Joda DateTime、格式化和Mysql时间戳

Java Joda DateTime、格式化和Mysql时间戳,java,datetime,Java,Datetime,在经历了一周的大量示例之后,从Java Date开始, 给日历,给乔达。我已决定向其他方面寻求帮助 问题是: 我们的表有两个字段Date(Timestamp)和TZ(String)。这个想法是存储 用户的UTC时间戳和时区,好吧,你知道了。所以基本上 我们以UTC为单位进行思考,并向用户提供转换为时间的时间 前端的时区(即,使用table.TZ中的值存储) 另一个要求是使用适当的对象(日期、日期时间等)。 并且不传递日期的字符串表示形式。最好的 是一个有效的Long,将由MySQL正确翻译,而无

在经历了一周的大量示例之后,从Java Date开始, 给日历,给乔达。我已决定向其他方面寻求帮助

问题是:

我们的表有两个字段Date(Timestamp)和TZ(String)。这个想法是存储 用户的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());
}

尼克。

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


格式化程序使用格式
yyyy-MM-dd-HH:MM:ss
进行解析,而
DateTime
toString()方法使用ISO8601格式(yyyy-MM-ddTHH:MM:ss.SSSZZ)对日期进行格式化。

解析的字符串的格式与格式化程序的格式不匹配,因此会崩溃


格式化程序使用格式
yyyy-MM-dd-HH:MM:ss
进行解析,并且
DateTime
toString()方法使用ISO8601格式(yyyy-MM-ddTHH:MM:ss.SSSZZ)对日期进行格式化。

谢谢,但是格式化程序不负责重塑表示吗?我不确定我是否遵循:S。我明白你的意思,将格式化程序更改为“yyy-MM-dd'HH:MM:ss.SSSZZ”,停止崩溃并输出正确的UTC“2013-08-23T21:28:04.290+00:00”。但是,我们需要DateTime格式为“yyy-MM-dd HH:MM:ss”。当你要求格式化程序将DateTime格式化为字符串时,使用
formatter.prin(格式化的日期时间)
。但你没有。调用
DateTime.toString()
将日期时间转换为字符串。我真的不明白你想用System.out.println语句做什么。顺便说一句,DateTime没有任何格式。它是一个毫秒数,是一个时区标识符。只有那个。当您将此值转换为字符串时,您可以选择使用哪种格式,这要归功于DateTimeFormatter。toString()方法使用ISO8601格式将日期时间转换为字符串。是否有一个函数可以在一个
Long
DateTime
对象中表示DateTime,这个对象可以很好地处理MySQL?我的问题是Mysql抱怨“数据截断:不正确的日期时间值:'2013-08-23T17:28:04.322-04:00'”。没有将其转换为字符串,我已经很好地工作了。哦,我错过了这一部分,System.out语句只是为了确保我能够以一种允许将值存储在数据库中的方式格式化DateTime。只是为了测试…谢谢,但格式化程序不负责重新格式化表示吗?我不确定我是否遵循:S。我明白你的意思,将格式化程序更改为“yyy-MM-dd'HH:MM:ss.SSSZZ”,停止崩溃并输出正确的UTC“2013-08-23T21:28:04.290+00:00”。但是,我们需要DateTime格式为“yyy-MM-dd HH:MM:ss”。当你要求格式化程序将DateTime格式化为字符串时,使用
formatter.prin(格式化的日期时间)
。但你没有。调用
DateTime.toString()
将日期时间转换为字符串。我真的不明白你想用System.out.println语句做什么。顺便说一句,DateTime没有任何格式。它是一个毫秒数,是一个时区标识符。只有那个。当您将此值转换为字符串时,您可以选择使用哪种格式,这要归功于DateTimeFormatter。toString()方法使用ISO8601格式将日期时间转换为字符串。是否有一个函数可以在一个
Long
DateTime
对象中表示DateTime,这个对象可以很好地处理MySQL?我的问题是Mysql抱怨“数据截断:不正确的日期时间值:'2013-08-23T17:28:04.322-04:00'”。没有将其转换为字符串,我已经很好地工作了。哦,我错过了这一部分,System.out语句只是为了确保我能够以允许将值存储在数据库中的方式格式化DateTime。只是为了测试。。。