mongodb ISODate问题

时间:2014-01-06 01:45:30

标签: java 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"));
}

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

小点:时区的三字母代码已经过时,应该避免。它们既不标准也不独特。使用proper time zone names

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

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

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

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

更新

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

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

您可以在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();