小时数没有改变。鉴于你的例子中有“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();
CST
。 - millhousetoString()
方法打印时,它会混淆地使用 JVM 的默认时区进行渲染。请参见我的答案。 - Basil Bourque