时间没有改变。鉴于示例中的“CST”和 8 小时时差,您必须在中国。如果您将“CST”解释为“中国标准时间 http://www.timeanddate.com/library/abbreviations/timezones/asia/cst.html“ (而不是中部标准时间 http://www.timeanddate.com/library/abbreviations/timezones/na/cst.html在美国),那么您的时区比美国早 8 小时UTC https://en.wikipedia.org/wiki/Coordinated_Universal_Time/格林威治标准时间。因此,当 UTC/GMT 凌晨 1 点时,台北墙上的时钟将同时显示“上午 9 点”。
小一点:那些时区的三字母代码已经过时,应该避免。它们既不是标准化的也不是独特的。使用正确的时区名称 http://joda-time.sourceforge.net/timezones.html.
主要观点:问题在于如何从 MongoDB 中提取表示日期时间的值。
我不了解 MongoDB,而且他们的医生 http://docs.mongodb.org/manual/core/shell-types/很混乱,所以我无法进一步帮助你。如果您可以检索ISO 8601 https://en.wikipedia.org/wiki/ISO_8601如第一个示例中所示的字符串,这比第二个示例的格式要好得多。
如果您想在 Java 中使用日期时间值,您可以将 ISO 8601 字符串直接提供给DateTime http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html构造函数在乔达时间 http://www.joda.org/joda-time/ 2.3.
DateTime dateTime = new DateTime( "2013-10-21T01:34:04.808Z" );
Update
This doc http://docs.mongodb.org/ecosystem/drivers/java-types/#JavaTypes-Dates/Times说 MongoDB 的 Java 驱动程序将为您提供一个 java.util.Date 对象。这解释了你的问题。与 Java 捆绑在一起的 java.util.Date 和 Calendar 类是出了名的糟糕。一个问题是,虽然 Date 实例没有时区,但它的toString()
方法使用 JVM 的默认时区来呈现字符串。 Date 的 toString 方法使用了那种可怕的模糊格式。
您应该避免使用 java.util.Date 和 Calendar 类。现在使用乔达时间 http://www.joda.org/joda-time/图书馆。在 Java 8 中,您可以使用新的java.time.* 类 http://download.java.net/jdk8/docs/api/java/time/package-summary.html.
您可以在 java.util.Date 和 Joda-Time 之间来回转换。将 Date 实例传递给 Joda-Time 构造函数。要返回,请致电 Joda-TimetoDate()
format.
请注意,虽然 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();