【问题标题】:withZone(DateTimeZone.UTC) of DateTimeFormatter changing the value of date [duplicate]DateTimeFormatter 的 withZone(DateTimeZone.UTC) 更改日期的值 [重复]
【发布时间】:2016-11-30 00:52:15
【问题描述】:

我有下面的代码

    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

我怎样才能得到这个?

【问题讨论】:

  • 如果您希望时区为 IST,为什么要使用 UTC?如果您使用 IST 时区会发生什么?如果您在 IST 时区,为什么要设置它?
  • 你在解析的DateTime上调用toDate(),它返回一个java.util.Date;当你打印这个时,它总是在你当地的时区打印。请注意,java.util.Date 不记得任何时区信息。
  • "印度标准时间 (IST) 比协调世界时早 5:30 小时。"来自timeanddate.com/time/zones/ist。 ;)
  • @PeterLawrey,这是一个独立的应用程序,我有一个在不同时区运行的项目。所以我想要的结果是 Sun Apr 01 00:00:00 IST 2012
  • @PeterLawrey jsr310(或任何 toDate 方法)中没有 ISODateTimeFormat,但在 jodatime 中有,所以我怀疑问题是关于 Joda。

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


【解决方案1】:

首先,您不应使用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

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2021-01-20
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多