使用SimpleFramework解析日期

hsz*_*hsz 15 java date simple-framework

我收到一个XML响应,其属性包含以下值:

Wed Sep 05 10:56:13 CEST 2012
Run Code Online (Sandbox Code Playgroud)

我在我的模型类中定义了一个带注释的字段:

@Attribute(name = "regDate")
private Date registerDate;
Run Code Online (Sandbox Code Playgroud)

但是它引发了一个例外:

java.text.ParseException: Unparseable date: "Wed Sep 05 10:56:13 CEST 2012" (at offset 0)
Run Code Online (Sandbox Code Playgroud)

是否可以在SimpleFramework注释中定义日期格式?

该日期字符串应包含哪种格式?

oll*_*llo 36

SimpleXML只支持一些DateFormat:

  • yyyy-MM-dd HH:mm:ss.S z
  • yyyy-MM-dd HH:mm:ss z
  • yyyy-MM-dd z
  • YYYY-MM-DD

(有关每个字符的含义,请参阅SimpleDateFormat API Doc(Java SE 7))

但是,可以编写Transform处理其他格式的自定义:

转变

public class DateFormatTransformer implements Transform<Date>
{
    private DateFormat dateFormat;


    public DateFormatTransformer(DateFormat dateFormat)
    {
        this.dateFormat = dateFormat;
    }



    @Override
    public Date read(String value) throws Exception
    {
        return dateFormat.parse(value);
    }


    @Override
    public String write(Date value) throws Exception
    {
        return dateFormat.format(value);
    }

}
Run Code Online (Sandbox Code Playgroud)

相应的注释

@Attribute(name="regDate", required=true) /* 1 */
private Date registerDate;
Run Code Online (Sandbox Code Playgroud)

注1: required=true是可选的

如何使用它

// Maybe you have to correct this or use another / no Locale
DateFormat format = new SimpleDateFormat("EE MMM dd HH:mm:ss z YYYY", Locale.US);


RegistryMatcher m = new RegistryMatcher();
m.bind(Date.class, new DateFormatTransformer(format));


Serializer ser = new Persister(m);
Example e = ser.read(Example.class, xml);
Run Code Online (Sandbox Code Playgroud)

  • `SimpleDateFormat`不是线程安全的.在线程之间共享`dateFormat`状态时要小心. (3认同)