2012-04-24 4 views
0

J'ai une classe qui convertissent DateTime comme ci-dessous:Fuseau horaire indépendante

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class DateFormatConverter extends XmlAdapter<String, Date> { 

    private static final String XML_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS z"; 

    @Override 
    public Date unmarshal(String xmlDate) throws Exception { 
    if (xmlDate == null || xmlDate.length() == 0) 
    { 
     return null; 
    }  
    SimpleDateFormat xmlDateFormat = new SimpleDateFormat(XML_DATE_PATTERN);  
    return xmlDateFormat.parse(xmlDate); 
    } 

    @Override 
    public String marshal(Date date) throws Exception { 
    if (date == null) { 
     return ""; 
    }  
    SimpleDateFormat xmlDateFormat = new SimpleDateFormat(XML_DATE_PATTERN);  
    return xmlDateFormat.format(date); 
    } 
} 

Et mon test unitaire:

public void testMarshalDate() throws Exception { 

    DateFormatConverter converter = new DateFormatConverter(); 
    SimpleDateFormat dateFormater = new SimpleDateFormat("MM-dd-yyyy"); 
    Date date = dateFormater.parse("10-13-2011"); 

    String marshalledDate = converter.marshal(date); 

    String timezone = Calendar.getInstance().getTimeZone().getDisplayName(true, TimeZone.SHORT); 

    System.out.println("Default Timezone:" + TimeZone.getDefault().getDisplayName(true, TimeZone.SHORT)); 
    System.out.println("Timezone of formatter:" + dateFormater.getTimeZone().getDisplayName(true, TimeZone.SHORT)); 
    System.out.println("Timezone:" + timezone); 
    System.out.println("MarshaledDate: " + marshalledDate); 

    assertEquals("Marshalled date string is not expected.", "2011-10-13 00:00:00.000 " + timezone, marshalledDate); 
    } 

La sortie dans la console est:

Default Timezone:ICST 
Timezone of formatter:ICST 
Timezone:ICST 
MarshaledDate: 2011-10-13 00:00:00.000 ICT 

Exception est :

Marshalled date string is not expected. expected:<...S...> but was:<......> 
junit.framework.ComparisonFailure: Marshalled date string is not expected. expected:<...S...> but was:<......> 

Pourquoi la date de marshaled a ICT de fuseau horaire tandis que le fuseau horaire par défaut de mon emplacement est ICST. Comment dois-je corriger pour rendre le Timezone indépendant?

Répondre

0

Je suppose que vous voyez la différence entre "partie d'un fuseau horaire" et "nom du fuseau horaire". Par exemple, la zone au Royaume-Uni utilise GMT et BST, les deux sont vraiment partie d'un fuseau horaire avec un identifiant de "Europe/Londres" bien que je ne sais pas quel serait le nom d'affichage dans ce cas.

Si vous n'avez pas besoin le fuseau horaire par défaut ici, spécifiez-le comme quelque chose comme UTC dans le formaté lorsque vous le créez. (Appelez setTimeZone après l'appel du constructeur.)

+0

Je l'ai corrigé, le problème est la cause de cette ligne: – Barcelona

+0

Je l'ai corrigé, le problème est la cause de cette ligne: String timezone = Calendar.getInstance(). GetTimeZone () .getDisplayName (true, TimeZone.SHORT); Laissons true à false, car par défaut, SimpledateFormat utilise un format qui n'est pas en plein jour (dans ce cas, c'est ICT). – Barcelona