mongodb ISODate问题

我正在使用java(IDE是eclipse)来查询mongodb。 下面是我的java代码:

DBObject query = new BasicDBObject(); ObjectId id =new ObjectId("529f280b90ee58cb7732c2b8"); query.put("_id", id); DBCursor cursor = collection.find(query); while(cursor.hasNext()) { DBObject object = (DBObject)(cursor.next()); System.out.println(object.get("_id")); System.out.println(object.get("createDate")); } 

createDate中出现问题,其类型为ISODate,值为ISODate("2013-10-21T01:34:04.808Z") ,但我的代码的println结果为'Mon Oct 21 **09**:34:04 CST 2013'小时从01变为09 。 我不知道发生了什么!

有人可以帮忙吗?

小时没变。 你必须在中国,在你的例子中给出“CST”和8小时的差异。 如果您将“CST”解释为“ 中国标准时间 ”(而不是美国的中央标准时间 ),那么您的时区比UTC / GMT提前8小时。 因此当ti是UTC时间上午1点/ GMT时,在同一时刻,台北墙上的时钟将显示为“上午9点”。

小点:时区的三字母代码已经过时,应该避免。 它们既不标准也不独特。 使用适当的时区名称 。

重点:问题在于如何从MongoDB中提取表示日期时间的值。

我不知道MongoDB, 他们的文档令人困惑,所以我无法帮助你。 如果您可以检索第一个示例中所示的ISO 8601字符串,那么这比第二个示例的格式要好得多。

如果要使用Java中的日期时间值,可以将ISO 8601字符串直接提供给Joda-Time 2.3中的DateTime构造函数。

 DateTime dateTime = new DateTime( "2013-10-21T01:34:04.808Z" ); 

更新

该文档说MongoDB的Java驱动程序将为您提供java.util.Date对象。 这解释了你的问题。 与Java捆绑在一起的java.util.Date和Calendar类非常糟糕。 一个问题是,虽然Date实例没有时区,但其toString()方法使用JVM的默认时区来呈现字符串。 而Date的toString方法使用了那种可怕的模糊格式。

您应该避免使用java.util.Date和Calendar类。 现在使用Joda-Time库。 在Java 8中,您可以使用新的java.time。*类 。

您可以在java.util.Date和Joda-Time之间来回转换。 将Date实例传递给Joda-Time构造函数。 要返回,请调用Joda-Time toDate()格式。

请注意,虽然java.util.Date中没有时区信息,但DateTime对象确实指定了时区。 如果需要UTC / GMT,请指定DateTimeZone.UTC

您的代码看起来应该更像:

 java.util.Date date = object.get("createDate"); DateTime createDateTime = new DateTime( date, DateTimeZone.forId( "Asia/Manila" ) ); System.out.println( createDateTime ); … do some work … java.util.Date dateGoingBackToMongoDB = createDateTime.toDate(); 
Interesting Posts