MongoDB ISODate问题

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

有人能帮忙吗?


看一下时区 - 其中一个是Zulu时间(即UTC),你打印出来的是CST - millhouse
是的。你的意思是mongodb中所有的ISODate值都使用UTC时区吗?这是否意味着在插入一个不是UTC时区的DateTime之前,我必须手动将其转换为UTC,然后再插入到mongodb中? - wuchang
不应该需要“手动”,但是是一个好的实践将日期存储为UTC,并在必要时为最终用户进行转换。参考链接:https://dev59.com/U3E85IYBdhLWcg3w8IbK - millhouse
一个 java.util.Date 对象没有时区信息,但是当通过隐式调用它的 toString() 方法打印时,它会混淆地使用 JVM 的默认时区进行渲染。请参见我的答案 - Basil Bourque
1个回答

2
小时数没有改变。鉴于你的例子中有“CST”和8小时的时差,你一定在中国。如果你将“CST”解释为中国标准时间(而不是美国的中央标准时间),那么你就有了一个比协调世界时/格林威治标准时间快8个小时的时区。因此,当协调世界时/格林威治标准时间是早上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.*类

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接