【问题标题】:Format Date Fields to String in XStream在 XStream 中将日期字段格式化为字符串
【发布时间】:2012-03-04 09:29:32
【问题描述】:

我有一个日期字段,当使用XStream 将其转换为 xml 时,以毫秒和区域为单位给出时间。我只需要将其转换或格式化为"MMMM dd, yyyy HH:mm:ss"。如何使用 XStream 做到这一点?我不想改变 getter 和 setter。谢谢。

我的班级:

    public class Datas {
    private String name;
    private Calendar dob;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Calendar getDob() {
        return dob;
    }

    public void setDob(Calendar dob) {
        this.dob = dob;
    }

    public static void main(String[] args) {
        Datas datas = new Datas();
        datas.setName("Ahamed");
        datas.setDob(Calendar.getInstance());
        XStream stream = new XStream();
        System.out.println(stream.toXML(datas));
    }
}

输出:

<Datas>
  <name>Ahamed</name>
  <dob>
    <time>1329081818801</time>
    <timezone>Asia/Calcutta</timezone>
  </dob>
</Datas>

我想在不更改 getter 和 setter 的情况下格式化 dob 标签。谢谢。

【问题讨论】:

标签: java date format xstream


【解决方案1】:

一种简单的方法是使用适当的格式注册(XStream!)DateConverter,例如:

import com.thoughtworks.xstream.converters.basic.DateConverter;

XStream xstream = new XStream();
String dateFormat = "yyyyMMdd";
String timeFormat = "HHmmss";
String[] acceptableFormats = {timeFormat};
xstream.registerConverter(new DateConverter(dateFormat, acceptableFormats));

这对我有用,我不需要创建新的转换器类。

【讨论】:

    【解决方案2】:

    Calendar 字段的自定义转换器:

    public class DateConverter implements Converter {
    
        private SimpleDateFormat formatter = new SimpleDateFormat(
                "MMMM dd, yyyy HH:mm:ss");
    
        public boolean canConvert(Class clazz) {
            // This converter is only for Calendar fields.
            return Calendar.class.isAssignableFrom(clazz);
        }
    
        public void marshal(Object value, HierarchicalStreamWriter writer,
                MarshallingContext context) {
            Calendar calendar = (Calendar) value;
            Date date = calendar.getTime();
            writer.setValue(formatter.format(date));
        }
    
        public Object unmarshal(HierarchicalStreamReader reader,
                UnmarshallingContext context) {
            GregorianCalendar calendar = new GregorianCalendar();
            try {
                calendar.setTime(formatter.parse(reader.getValue()));
            } catch (ParseException e) {
                throw new ConversionException(e.getMessage(), e);
            }
            return calendar;
        }
    }
    

    将上述转换器注册到XStream对象如下:

    XStream xStream = new XStream();
    xStream.registerConverter(new DateConverter());
    

    现在xStream 对象将查找日历字段并按照自定义转换器中的定义进行编组。

    【讨论】:

    • 注意这一点:SimpleDateFormat 不是线程安全的。解决这个问题的最简单方法是每次需要时都构造一个新的 SDF。
    【解决方案3】:

    您必须使用自定义转换器,在 marshal 方法下,您可以根据需要修改日期格式。
    应该在 DOB 节点之后进行。
    我认为你不需要在解组方法中做任何事情。
    祝你好运:)

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      相关资源
      最近更新 更多