Java mongodb等值线问题

Java mongodb等值线问题,java,mongodb,isodate,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 =

我正在使用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。我不知道发生了什么事


有人能帮忙吗?

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

小问题:时区的三个字母代码已经过时,应该避免使用。它们既不是标准化的,也不是独特的。使用

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

我不知道MongoDB,它让人困惑,所以我无法进一步帮助您。如果可以检索第一个示例中所示的字符串,那么这比第二个示例的格式要好得多

如果您想在Java中使用日期时间值,可以在2.3中直接向构造函数提供ISO 8601字符串


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

应该避免使用java.util.Date和Calendar类。现在使用图书馆。在Java8中,您可以使用新的

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

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

您的代码应该更像:

java.util.Date=object.get(“createDate”);
DateTime createDateTime=新的日期时间(日期,DateTimeZone.forId(“亚洲/马尼拉”);
System.out.println(createDateTime);
…做些工作…
java.util.Date dateGoingBackToMongoDB=createDateTime.toDate();

查看时区-一个是祖鲁时间(即UTC),您打印出来的是
CST
。是的。您的意思是mongodb中的所有ISODate值都使用UTC时区?这是否意味着在插入时区不是UTC的日期时间之前,我必须手动将其转换为UTC,然后插入mongodb?它不需要是“手动”的,但是,是的,它将日期存储为UTC,并在最终用户需要时进行转换。java.util.Date对象没有时区信息,但是当通过隐式调用其
toString()
方法打印时,它会使用JVM的默认时区进行混乱的呈现。看见
DateTime dateTime = new DateTime( "2013-10-21T01:34:04.808Z" );