2017-08-07 7 views
0

J'utilise le framework Dozer pour copier les attributs d'une classe à une autre.Conversion de la date et de l'heure UTC en un format local. Comment accéder à un champ à partir d'une méthode Dozer Convert en utilisant Java?

public class Source { 

    private BigDecimal customerid; 
    private BigDecimal tenantid; 
    private BigDecimal salutation; 
    private String timezone; 
    private Calendar createdate; 
} 

public class Target { 

    private BigDecimal customerid; 
    private String timezone; 
    private String createdate; 
} 

Jusqu'à présent, une fonction a été créée et fonctionne très bien lors de l'exécution des 2 lignes ci-dessous:

List<Source> customrlist = customerdao.findByTenantid(tenantid); 

// copy the data into the structure that is to be returned to the client 
List<Target> actual = DozerListServices.map(mapper, customrlist, 
     Target.class); 

Maintenant, il y a un désir de faire un changement.

L'un des attributs utilisés (dans la classe Source) est Calendrier. Le but serait de convertir "Calendar" en "String" (dans la classe Target). La chaîne serait dans un certain format (ex: AAAA-MM-JJ)

Pour ce faire, il a été suggéré d'utiliser un « DozerConverter » - ce qui serait ressemble à quelque chose comme ceci:

public class DozerStringToCalTimeConvert extends 
     DozerConverter<String, Calendar> { 

    public DozerStringToCalTimeConvert() { 
     super(String.class, Calendar.class); 
    } 


    @Override 
    public Calendar convertTo(String source, Calendar destination) { 

     if (!StringUtils.hasLength(source)) { 
      return null; 
     } 
     Calendar dt = null; 

     return dt; 
    } 

    @Override 
    public String convertFrom(Calendar source, String destination) { 
     if (source == null) { 
      return null; 
     } 
     return source.toString(); 
    } 
} 

Bien que l'on puisse utiliser Formatters pour convertir le calendrier à la représentation Corret (ex: AAAA-MM-JJ), le problème est que la date est au format UTC. L'un des attributs de la classe "Source" est "timezone". Le fuseau horaire ressemblerait à «America/Chicago», «US/Eastern», etc. Les informations «timezone» sont nécessaires pour convertir l'heure UTC en heure locale. Avec l'exemple de code du convertisseur ci-dessus, comment pourrait-on y apporter des modifications afin que l'on puisse accéder à "timezone" depuis la classe Source.

TIA

Répondre

0

java.time

La classe est Calendar héritage maintenant, supplanté par les classes java.time.

Votre objet Calendar est probablement un GregorianCalendar. Test avec instanceOf. Si c'est le cas, cast et convertir en java.time.ZonedDateTime.

if (myCal instanceOf GregorianCalendar) { 
    GregorianCalendar gc = (GregorianCalendar) myCal ; 
    ZonedDateTime zdt = gc.toZonedDateTime() ; 
    LocalDate ld = zdt.toLocalDate() ; // A date-only value deduced from the time zone assigned. 
    String output = ld.toString() ; // Generate string in standard ISO 8601 format YYYY-MM-DD. 
} 
+0

merci pour la réponse. Ci-dessus, je vois que vous avez que je devrais utiliser "ZonedDateTime". La zone utilisée n'est pas locale en soi mais extraite de la base de données. Dans la classe "Source" ci-dessus, il y a un champ pour la Zone appelé "fuseau horaire". Peut-on accéder à cette valeur à partir d'une classe qui a étendu "DozerConverter" - voir la classe de convertisseur ci-dessus appelée "DozerStringToCalTimeConvert". L'attribut peut-il être accédé à partir de la méthode "convertTo" ou "convertFrom"? Si c'est le cas, comment? –

+0

comment peut-on utiliser "instanceOf" dans la méthode "convertTo" ou "convertFrom"? TIA –

+0

@CaseyHarrils Voir mes éditions et [le tutoriel Oracle.com] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html) pour en savoir plus sur 'instanceOf'. Je ne sais rien de Dozer, alors je ne peux pas vous aider là-bas. –