如何在Joda-Time中仅使用时区解析日期?

时间:2014-06-30 12:13:21

标签: java jodatime

我想使用Joda-Time来解析带有可选时区的日期:2014-08-08+02:00

我尝试了ISODateTimeFormat.dateTimeParser().parseDateTime(date);,但这给了我以下错误:

java.lang.IllegalArgumentException: Invalid format: "2014-08-08+02:00" is malformed at "+02:00"

2 个答案:

答案 0 :(得分:3)

我不知道处理可选数据的更好方法,而不是拥有多个模式并依次解析它们。请参阅下面的代码示例:

public static void main(String[] args) throws Exception {
  System.out.println(parseWithOptionalTZ("2014-08-08+02:00"));
  System.out.println(parseWithOptionalTZ("2014-08-08"));
}

private static DateTime parseWithOptionalTZ(String date) {
  DateTimeFormatter[] formatters = { 
      DateTimeFormat.forPattern("YYYY-MM-dd"),
      DateTimeFormat.forPattern("YYYY-MM-ddZ") 
  };

  for (DateTimeFormatter dateTimeFormatter : formatters) {
    try {
      return dateTimeFormatter.parseDateTime(date);
    } catch (IllegalArgumentException e) {
      // ignore
    }
  }

  throw new IllegalArgumentException("Could not parse: " + date);
}

输出:

2014-08-07T23:00:00.000+01:00
2014-08-08T00:00:00.000+01:00

答案 1 :(得分:2)

时区至关重要

请勿忽略评论中提到的时区或偏移。

忽略日期时间的时区就像忽略温度读数上的C / F(摄氏/华氏)或忽略文本的字符集编码。你会误解你的数据。

使用时区解析

在解析期间指定时区可以在Joda-Time中具有两种不同的效果。仔细考虑一下,你会发现这是合乎逻辑的,并且正在做正确的事。

解析后

如果在格式化程序上指定时区以解析包含偏移量或时区的输入,则Joda-Time会在解析期间注意所包含的偏移量。 之后确定日期时间(它在Universe的时间轴上定义为自UTC时区1970年开始以来的毫秒数,也就是没有时区),然后指定时区被分配给DateTime对象。在这种情况下,传递指定的时区不会影响解析。指定的时区会影响该日期时间值的String 表示的生成。

解析期间

另一方面,如果您在格式化程序上指定了解析输入缺少任何偏移或时区信息的时间,那么Joda-Time会在<期间使用您指定的时区 / em>解析输入字符串。

示例代码,Joda-Time

以下是使用Joda-Time 2.3的示例代码。首先是正确的方法,在解析字符串时使用偏移量。第二种是错误的方式,忽略了偏移。请注意不同的结果,不同的日期时间值,甚至可能是不同的日期(取决于用于创建字符串表示的时区)。

有偏移

String input = "2014-08-08+02:00";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MM-ddZ" ).withZone( DateTimeZone.UTC );
DateTime dateTimeUsingOffset = formatter.parseDateTime( input ); // Offset used to determine date-time during parsing. After parsing the UTC time zone is assigned.

没有偏移

String inputTruncatedOffset = input.substring( 0, 10 );
DateTime dateTimeIgnoringOffset = new DateTime( inputTruncatedOffset, DateTimeZone.UTC ); // In contrast to above, the UTC time zone is used *during* parsing to determine date-time as the input string contained no hint about offset or time zone.

转储到控制台。

System.out.println( "input: " + input );
System.out.println( "dateTimeUsingOffset: " + dateTimeUsingOffset );

System.out.println( "inputTruncatedOffset: " + inputTruncatedOffset );
System.out.println( "dateTimeIgnoringOffset: " + dateTimeIgnoringOffset );

跑步时。

input: 2014-08-08+02:00
dateTimeUsingOffset: 2014-08-07T22:00:00.000Z

inputTruncatedOffset: 2014-08-08
dateTimeIgnoringOffset: 2014-08-08T00:00:00.000Z