【问题标题】:Parse date with SimpleFramework使用 SimpleFramework 解析日期
【发布时间】:2012-09-05 09:03:23
【问题描述】:

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

Wed Sep 05 10:56:13 CEST 2012

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

@Attribute(name = "regDate")
private Date registerDate;

但是它会抛出异常:

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

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

应该用什么格式覆盖这个日期字符串?

【问题讨论】:

标签: java date simple-framework


【解决方案1】:

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

}

对应的注解

@Attribute(name="regDate", required=true) /* 1 */
private Date registerDate;

注意 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);

【讨论】:

  • 好像只支持yyyy-MM-dd HH:mm:ss.S z。尝试过其他人并出现异常...但是您的解决方案很棒,我已经通过一个循环对其进行了改进,以一次支持多种格式而没有异常。
  • 感谢您的提示 (+1)。
  • “如何使用”部分?那在你的代码中,你想序列化/反序列化 xml/对象。
  • SimpleDateFormat 不是线程安全的。在线程之间共享dateFormat 状态时要小心。
  • @Burno,这是真的。投票。但是,它在 Java 8 中是线程安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2013-12-04
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多