如何用格式的可选字符解析日期

时间:2016-06-30 13:33:53

标签: java date jackson jodatime

我有以下两个日期:

  • 2009年10月8日
  • 2010年5月13日

我正在使用Jackson将日期从休息api转换为joda Datetime。

我认为模式"dd MMM. yyyy"会起作用,但“可能”没有点,所以它在那时崩溃了。

是否有解决方案或我是否必须编写自己的日期时间解析器?

杰克逊的注释是:

@JsonFormat(pattern = "dd MMM. yyyy", timezone = "UTC", locale = "US", )
@JsonProperty(value = "date")
private DateTime date;

因此只允许一种日期模式。

3 个答案:

答案 0 :(得分:1)

鉴于OP的新评论和要求,解决方案是使用自定义反序列化器:

你会做这样的事情:

@JsonDeserialize(using = MyDateDeserializer.class)
class MyClassThatHasDateField {...}

请参阅此处的教程:http://www.baeldung.com/jackson-deserialization

请在此处查看示例:Custom JSON Deserialization with Jackson

OLD ANSWER:

您可以使用Java的SimpleDateFormat

  1. 使用正则表达式选择正确的模式
  2. 只需尝试它们并捕获(并忽略)异常
  3. 示例:

    String[] formats = { "dd MMM. yyyy", "dd MM yyyy" };
    
    for (String format : formats)
    {
        try
        {
            return new SimpleDateFormat( format ).parse( theDateString );
        }
        catch (ParseException e) {}
    }
    

    OR

    String[] formats = { "dd MMM. yyyy", "dd MM yyyy" };
    String[] patterns = { "\\d+ [a-zA-Z]+\. \d{4}", "\\d+ [a-zA-Z]+ \d{4}" };
    
    for ( int i = 0; i < patterns.length; i++ )
    {
      // Create a Pattern object
      Pattern r = Pattern.compile(patterns[ i ] );
    
      // Now create matcher object.
      Matcher m = r.matcher( theDateString );
    
      if (m.find( )) {
         return new SimpleDateFormat( formats[ i ] ).parse( theDateString );
      }
    }
    

答案 1 :(得分:0)

你可以定义两个格式化程序并使用带点的格式化程序,如果它存在于字符串中。

String dateString = "8 Oct. 2009";

DateTimeFormatter formatWithDot    = DateTimeFormat.forPattern("dd MMM. yyyy");
DateTimeFormatter formatWithoutDot = DateTimeFormat.forPattern("dd MMM yyyy");

DateTime date = dateString.indexOf('.') > -1
    ? formatWithDot.parseDateTime(dateString)
    : formatWithoutDot.parseDateTime(dateString);

答案 2 :(得分:0)

通过修复字符串进行解析也会有不同的方法:

String date = "13 May. 2009";
DateTime result = DateTime.parse(date.replace(".",""),
DateTimeFormat.forPattern("dd MMM yyyy"));