如何使用格式中的可选字符解析日期
How to parse date with optional characters in format
我有以下两个日期:
- 2009 年 10 月 8 日
- 2010 年 5 月 13 日
我正在使用 Jackson 将日期从休息 api 转换为 joda 日期时间。
我认为模式 "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
和:
- 使用正则表达式选择正确的模式
- 只需尝试它们并捕获(并忽略)异常
示例:
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 );
}
}
您可以只定义两个格式化程序并使用带点的那个,如果它出现在字符串中。
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);
固定字符串解析也有不同的方法:
String date = "13 May. 2009";
DateTime result = DateTime.parse(date.replace(".",""),
DateTimeFormat.forPattern("dd MMM yyyy"));
我有以下两个日期:
- 2009 年 10 月 8 日
- 2010 年 5 月 13 日
我正在使用 Jackson 将日期从休息 api 转换为 joda 日期时间。
我认为模式 "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
和:
- 使用正则表达式选择正确的模式
- 只需尝试它们并捕获(并忽略)异常
示例:
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 );
}
}
您可以只定义两个格式化程序并使用带点的那个,如果它出现在字符串中。
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);
固定字符串解析也有不同的方法:
String date = "13 May. 2009";
DateTime result = DateTime.parse(date.replace(".",""),
DateTimeFormat.forPattern("dd MMM yyyy"));