UTC与GMT的区别
对于商业应用程序而言,UTC和GMT之间没有实际区别。唯一的区别是子秒分辨率和每几年添加一个闰秒。对于科学、天文、卫星跟踪等应用程序,差异可能很大,但这种情况很少见。
Jackson默认使用UTC/GMT
我不了解Jackson,但从您提供的文档看,它似乎会序列化:(a)自1970年1月1日起的毫秒数(UTC),或者(b)字符串格式,默认为ISO 8601格式:"1970-01-01T00:00:00.000+0000"。因此,回答您关于时区的问题,听起来Jackson默认始终使用UTC(无时区偏移),这是正确的方式。如果您关心该时间使用的时区,请将该事实(所使用的时区)记录在单独的字段中。
Jackson ↔ java.util.Date/Calendar ↔ Joda-Time
这些序列化值(毫秒和ISO 8601字符串)都可以与Joda-TimeDateTime实例的构造函数一起使用。
String dateTimeString = "2013-11-22T18:37:55.645+0000";
org.joda.time.DateTime myDateTime = org.joda.time.format.ISODateTimeFormat.dateTime().withZoneUTC().parseDateTime( dateTimeString );
并且...
Long millisSinceEpoch = 1385495462L;
org.joda.time.DateTime myDateTime = new org.joda.time.DateTime( millisSinceEpoch );
如果您无法直接访问这些序列化值以提供给Joda-Time DateTime构造函数,则让Jackson实例化java.util.Date / Calendar对象。将这些java.util.Date / Calendar对象提供给Joda-Time以实例化DateTime对象以进行进一步的操作。Joda-Time用户经常这样做。
org.joda.time.DateTime myDateTime = new org.joda.time.DateTime( someJavaUtilDateFromJackson );
你可以通过调用
toDateTime() 方法并传递所需的时区,轻松将UTC时间转换为其他时区的时间。
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = myDateTime.toDateTime( kolkataTimeZone );
Joda-Time的 toDate 方法可以轻松将时间转换为java.util.Date类型。因此,在Joda-Time中完成大部分工作,然后将其转换回java.util.Date类型以便与Jackson通信。当返回给Jackson时,为了确保准确性,建议将DateTime再次转回UTC时间。
myDateTime.toDateTime( org.joda.time.DateTimeZone.UTC )
在StackOverflow.com上可以找到许多上述Joda-Time操作的示例。
只需动手
我猜你担心得有点过了,而且编码不够。试着进行一些小实验,将值传入和传出Jackson和Joda-Time。你很快就会掌握它。我建议你让Jackson按默认方式做任何它想做的事情,然后再在Joda-Time中进行操作。Joda-Time是为日期时间复杂问题而构建的,而Jackson可能不是。 Joda-Time具有构造函数和方法,以根据需要调整时区。
更光明的未来
在Java 8中,JSR 310:日期和时间API将Joda-Time类内置到Java平台中。预计将看到像Jackson这样的框架更新为直接使用这些新类,同时弃用丑陋的java.util.Date / Calendar类。
看起来jackson-datatype-joda项目正试图为Joda-Time带来这种便利。但是对我来说似乎并不必要。你可以按照上面所讨论的方法在java.util.Date/Calendar和Joda-Time之间进行转换。
附言:该项目文档的“Wiki”链接失败了。因此,我无法查看它们的文档。