withZone(DateTimeZone.UTC)的DateTimeFormatter更改日期的值

时间:2016-07-26 11:33:15

标签: java datetime jodatime datetime-format java-6

我有以下代码

    final DateTimeFormatter COMBINED_FORMAT = ISODateTimeFormat.dateTimeParser().withZone(
                DateTimeZone.UTC);
         System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000").toDate());

结果 Sun Apr 01 05:30:00 IST 2012 我希望这会返回 Sun Apr 01 00:00:00 IST 2012

我怎么能得到这个?

1 个答案:

答案 0 :(得分:2)

首先,您不应使用java.util.Date.toString()(在您的示例中隐式使用)来评估结果。原因是它总是在系统时区输出而不是结果的真实状态,这是令人困惑的行为。

第二:如果您将区域设置为UTC,那么您指示解析器将无区域字符串“2012-04-01T00:00:00.000”解释为UTC而不是IST。只需看看结果的状态:

DateTimeFormatter COMBINED_FORMAT =
  ISODateTimeFormat.dateTimeParser().withZone(DateTimeZone.UTC);
System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000"));
// 2012-04-01T00:00:00.000Z

但是,如果您希望结果为“Sun Apr 01 00:00:00 IST 2012”(date.toString()的输出)或等效:“2012-04-01T00:00:00 + 05:30 “那么你必须指示解析器将输入解释为IST而不是UTC。

<强>解决方案:

DateTimeFormatter COMBINED_FORMAT =
    ISODateTimeFormat.dateTimeParser().withZone(DateTimeZone.forID("Asia/Kolkata"));
System.out.println(COMBINED_FORMAT.parseDateTime("2012-04-01T00:00:00.000"));
// 2012-04-01T00:00:00.000+05:30