当前位置: 首页 > 知识库问答 >
问题:

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

薛涛
2023-03-14

我有以下两个日期:

  • 2009年10月8日

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

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

有没有解决方案,或者我必须自己编写datetime解析器?

jackson中的注释是:

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

所以只允许有一种约会模式

共有3个答案

云宾鸿
2023-03-14

还有一种不同的方法是修复用于解析的字符串

String date = "13 May. 2009";
DateTime result = DateTime.parse(date.replace(".",""),
DateTimeFormat.forPattern("dd MMM yyyy"));
水铭晨
2023-03-14

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

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);
嵇永望
2023-03-14

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

你可以这样做:

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

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

这里有一个例子:使用Jackson进行自定义JSON反序列化

旧答案:

您可以使用Java的SimpleDataFormat,并且:

  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 );
  }
}
 类似资料: