3

我正在使用 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 且值为 的 createDate 出现问题ISODate("2013-10-21T01:34:04.808Z"),但println我的代码的结果是'Mon Oct 21 **09**:34:04 CST 2013'小时已从 01 更改为 09。我不知道发生了什么!

有人可以帮忙吗?

4

1 回答 1

2

小时没有改变。鉴于您示例中的“CST”和 8 小时时差,您必须在中国。如果您将“CST”解释为“中国标准时间”(而不是美国的中央标准时间),则您的时区比UTC /GMT 早 8 小时。因此,当 ti 是 UTC/GMT 凌晨 1 点时,台北墙上的时钟同时显示“上午 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.* classes

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

请注意,虽然 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();
于 2014-01-06T05:31:46.717 回答