这个问题是关于使用尤达-时间 DateTime的jackson-datatype-joda模块到Jackson的反序列化。是否存在将日期字符串反序列化到的默认时区?如果是,那又是什么呢?是https://en.wikipedia.org/wiki/Coordinated_Universal_Time吗?
我需要问这个问题,因为杰克逊的文档并不是专门针对Joda-Time DateTime的。我在本文(http://wiki.fasterxml.com/JacksonFAQDateHandling)中发现,杰克逊将假定https://en.wikipedia.org/wiki/Greenwich_Mean_Time为反序列化为java.util.Date或java.util.Calendar的默认时区。然而,在本文档中没有提到Joda-Time数据类型。此外,我特别需要字符串来使用UTC时区(而不是GMT )反序列化为DateTime对象:尽管这两个区域非常相似,但是有一些小的差异,因此GMT对我来说是不可行的。
谢谢。
发布于 2013-11-26 20:23:36
DateTimeDeserializer的源代码显示它使用了由ObjectMapper在反序列化期间提供的来自DeserializationContext的时区。如果您查看ObjectMapper API,您将看到设置时区的方法:
public ObjectMapper setTimeZone(TimeZone tz)因此,可以使用此方法配置ObjectMapper并将时区设置为正确的时区。
对于与默认值有关的问题,Javadoc似乎说了一件事,但代码却显示了另一回事。
用于ObjectMapper.setTimeZone(TimeZone tz)的Javadoc
/**
* Method for overriding default TimeZone to use for formatting.
* Default value used is {@link TimeZone#getDefault()}.
*/但是,代码显式地将时区设置为:
protected final static BaseSettings DEFAULT_BASE = new BaseSettings(
...
// TimeZone.getDefault()
TimeZone.getTimeZone("GMT"),
...因此,很明显,它实际上使用的是GMT,而不是默认的JVM缺省值。
我想说的是,最好的选择可能是不依赖于此,自己在ObjectMapper.setTimeZone(TimeZone tz)上设置它。
发布于 2013-11-26 19:53:01
UTC对GMT
对于商业应用程序,UTC和格林尼治标准时间并没有实际的区别。唯一的区别是亚秒分辨率和每隔几年增加一次闰秒。对于科学、天文学、卫星跟踪和类似的应用程序来说,差别可能是很大的,但这是罕见的。
杰克逊默认为UTC/GMT
我不认识杰克逊。但是从您链接的文档来看,它们似乎序列化了(a)自1970年1月1日以来的毫秒数,UTC,或(b)字符串格式,默认为ISO 8601格式:"1970-01-01T00:00:00.000+0000“。因此,要回答有关时区的问题,听起来似乎杰克逊总是使用UTC (没有时区偏移)序列化,这是正确的方法。如果您关心当时正在使用的时区,您应该在单独的字段中记录这个事实(什么时区)。
Jackson↔java.util.Date/日历↔Joda-Time
这两个序列化值(毫秒&ISO8601字符串)都可以与Joda时DateTime实例的构造函数一起使用。
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--时间实例化DateTime对象以供进一步工作。Joda-Time用户通常会这样做。
org.joda.time.DateTime myDateTime = new org.joda.time.DateTime( someJavaUtilDateFromJackson );通过调用toDateTime()方法并传递所需的时区,您可以轻松地将UTC时间转换为Joda-Time中的其他时区。
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = myDateTime.toDateTime( kolkataTimeZone ); Joda-Time很容易使用java.util.Date方法将其转换回toDate。所以,在Joda时间做大部分工作,并转换回java.util.Date与杰克逊沟通。当我回到杰克逊身边的时候,我会把我的DateTimes切换回UTC,只是为了更好的测量。
myDateTime.toDateTime( org.joda.time.DateTimeZone.UTC )您将在StackOverflow.com上找到上述Joda-Time操作的许多示例。
就这么做
我怀疑你做了太多的担心和没有足够的编码。只需尝试一些小实验,传递值进出杰克逊和约达时间。你很快就会掌握窍门的。我建议你让杰克逊在默认情况下做它想做的任何事情,然后在Joda-Time中操纵它。Joda-Time是为日期时间这一棘手的问题而建的,而杰克逊大概不是.Joda-Time有两个构造函数和方法,可以根据需要在时区之间进行调整。
光明的未来
在Java 8中,JSR 310:日期和时间API引入了内置在Java平台中的类Joda.希望看到杰克逊这样的框架被更新,直接使用这些新类,同时不推荐丑陋的java.util.Date/Calendar类。
现在看来,jackson-datatype-joda项目正试图为Joda-Time提供这样的便利。但在我看来这并不是必要的。您可以在java.util.Date/Calendar和Joda-Time之间进行转换,如上面所讨论的。
该项目文档的"Wiki“链接失败。所以我不能看他们的医生。
发布于 2016-02-08 14:05:22
我还与日期格式进行了斗争,最后找到了解决方案。我想使用"2016-02-08T12:49:22.876Z"格式,因为它是ISO8601,JavaScript 日期对象使用它。我还想一直使用UTC时区。
我发现这可以使用以下代码来完成:
final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(dateFormat);
System.out.println(objectMapper.writeValueAsString(new Date()));请注意格式字符串中的X字符。Java 7支持它,并在ISO 8601中指定时区。正如SimpleDateFormat中所记录的,如果时区偏移量为0 (UTC),则生成Z (而不是+00:00)。
https://stackoverflow.com/questions/20222376
复制相似问题