2012-02-12 112 views
4

我有一个日期字段,它在使用XStream转换为xml时给出时间(以毫秒为单位)和区域。我只需要将其转换或格式化为"MMMM dd, yyyy HH:mm:ss"。如何使用XStream做到这一点?我不想改变获得者和制定者。谢谢。将日期字段格式化为XStream中的字符串

我的类:

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标签。谢谢。

+0

巨大的XML如?我们可以举个例子吗? – 2012-02-12 21:20:12

+1

查看[XStream - Converter Tutorial](http://xstream.codehaus.org/converter-tutorial.html)。有一段关于日期转换的部分。 – mre 2012-02-12 21:29:31

+0

@mre感谢您的链接! – Ahamed 2012-02-13 08:08:40

回答

4
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对象将查找日历领域和意志定制转换器中定义的marshall。

0

你必须使用一个自定义转换器,在这个自定义转换器中,在编组方法下根据需要修改你的日期格式。
它应该在DOB节点之后完成。
我不认为你需要在解组方法中做任何事情。
好运:)

9

一个简单的方法是用适当的形式注册一个(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)); 

这对我的作品,我并不需要创建一个新的转换器类。