小时没有改变。鉴于您示例中的“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();