首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb ISODate问题

mongodb ISODate问题
EN

Stack Overflow用户
提问于 2014-01-06 01:45:29
回答 1查看 13.5K关注 0票数 3

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

代码语言:javascript
复制
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。我不知道发生了什么!

有人能帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-06 05:31:46

时间并没有改变。你一定是在中国,考虑到你的例子中的"CST“和8小时的差别。如果您将"CST“解释为"中国标准时间”(而不是在美国的中央标准时间 ),那么您的时区将比UTC/GMT提前8小时。所以当时间是凌晨1点时,台北墙上的钟会在同一时刻读"9点“。

次要问题:时区的三个字母代码已经过时,应该避免使用.它们既不标准化,也不独特。使用适当时区名称

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

我不知道MongoDB,他们的医生也很困惑,所以我不能再帮你了。如果您可以检索第一个示例中看到的ISO 8601字符串,那么这比第二个示例的格式要好得多。

如果您想使用Java中的日期时间值,可以直接将一个ISO8601字符串提供给尤达-时间 2.3中的尤达-时间构造函数。

代码语言:javascript
复制
DateTime dateTime = new DateTime( "2013-10-21T01:34:04.808Z" );

更新

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

您应该避免使用java.util.Date & Calendar类。现在使用尤达-时间库。在Java8中,您可以使用新的

您可以在java.util.Date和Joda-Time之间来回转换。将日期实例传递给Joda-Time构造函数。回到过去,打电话给Joda-Time toDate()格式。

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

您的代码应该更像:

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20941687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档