2017-04-14 72 views
0

我在MongoDB中现有的数据格式为这样:反序列化ISODate对象到Java POJO

"created_at" : ISODate("2011-11-25T18:17:16Z") 

当我尝试反序列化到使用吗啡的Java POJO,它给人的日期系统时区适用,而不是日期GMT日期。

/** 
* The Class AggregationQueryDetails. 
*/ 
public class AggregationQueryResultTriggeredPolicyDetails { 

    /** The triggered time. */ 
    private Date created_at; 

    /** The event ids. */ 
    private List<String> event_ids; 


    /** 
    * @return the CreatedAt 
    */ 
    public Date getCreatedAt() { 
     return created_at; 
    } 

    /** 
    * @param CreatedAt 
    *   the CreatedAt to set 
    */ 
    public void setCreatedAt(Date createdAt) { 
     this.created_at = createdAt; 
    } 
} 

我该如何避免时区转换?

+0

您可以添加相关的代码,你的POJO类?什么是你的Java和吗啡版本?您是如何验证日期是否在您当地的时区? – Veeram

+0

添加pojo类。 getCreatedAt方法将转换为本地时间值而不是实际时间。这是在调试我的代码时观察到的。 –

+0

这就是答案中提到的预期行为。 Date中保存的内部时间值是UTC值。所以你应该没问题。如果你在java 8上,你应该使用java.time.Instant。 – Veeram

回答

0

内部java.util.Date不存储时区。日期内部以UTC表示。您可以将日期格式化为您希望的时区。

您最有可能看到的行为是由于以下事实:当您在调试器中“查看”java.util.Date或通过打印它时,它将显示在本地时区中。

下面是如何格式化一个非常基本的例子:

public static String ISO_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS zzz"; 
private static final TimeZone utc = TimeZone.getTimeZone("UTC"); 
private static final SimpleDateFormat isoFormatter = new SimpleDateFormat(ISO_FORMAT); 
static { 
    isoFormatter.setTimeZone(utc); 
} 
... 

public String toString() { 
    return "myDate: " + isoFormatter.format(myDate); 
}