java - 如何解析格式中带有可选字符的日期

标签 java date jackson jodatime

我有以下两个日期:

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

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

我认为模式“dd MMM.yyyy”可以工作,但是“may”没有点,所以它在那时崩溃了。

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

jackson中的注释是:

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

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

最佳答案

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

你会做这样的事情:

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

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

请参阅此处的示例:Custom JSON Deserialization with Jackson

旧答案:

您可以使用 Java 的 SimpleDateFormat 以及:

  1. 使用正则表达式选择正确的模式
  2. 简单地尝试它们并捕获(并忽略)异常

示例:

String[] formats = { "dd MMM. yyyy", "dd MM yyyy" };

for (String format : formats)
{
    try
    {
        return new SimpleDateFormat( format ).parse( theDateString );
    }
    catch (ParseException e) {}
}

或者

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 );
  }
}

关于java - 如何解析格式中带有可选字符的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27503174/

相关文章:

java - 在循环中延迟重新绘制 JPanel

php - 在两个日期之间搜索并按月份排序

javascript - 比较字符串日期 html

java - 将具有自定义时区的 java.util.Date 转换为 UTC

scala - NoSuchMethodError : com. fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase.findFormatOverrides on Databricks

java - 特殊字符之前的子字符串并将其替换为相应的特殊字符

java - 计算java web客户端发送和接收的字节数

java - 使用 Jackson 解析 json 中的 boolean 值时的额外数据

java - PolyUtil.containsLocation 没有按预期工作

java - 时间减法有什么问题?