2012-02-12 96 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)); 

這對我的作品,我並不需要創建一個新的轉換器類。