2010-07-08 2 views
17

Je dois obtenir les détails du jour, du mois et de l'année d'une valeur Date mais getYear() est déprécié, donne l'année sur 2 chiffres, et a des problèmes avec l'an 2000 (108 donne 108). Le document java recommande d'utiliser java.util.calendar mais il n'est pas pris en charge dans GWT.Obtenir les détails de la date (jour, mois, année) dans GWT

Je veux éviter d'envoyer toutes les informations entre le serveur et le client juste pour gérer les dates.

Edit: Calendar peut être pris en chargefonctions de manipulation de date doivent être mises en œuvre dans GWT futur versions: http://code.google.com/p/google-web-toolkit/issues/detail?id=603

Répondre

19

Ne pas utiliser ces méthodes dépréciées sur Classe de date dans GWT. Si vous ne souhaitez pas utiliser les implémentations tierces de Date pour GWT, vous utilisez pour l'instant une combinaison de DateTimeFormat et de manipulation de chaînes pour que GWT prenne mieux en charge la manipulation des dates.

For date - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[0] 

For month - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[1] 

For year - 
DateTimeFormat.getFormat("d-M-yyyy").format(new Date()).split("-")[2] 

Modifier- De même, évitez d'utiliser new Date (yy mm, dd) a venir des incohérences en fonction de la plage du navigateur et la date.

Je vérifiions une simple classe DateUtil pour créer et analyser des objets Date à GWT, peut-être d'une certaine utilité pour vous -

(Attention: Très brut et les travaux en cours)

public class DateUtil 
{ 
    private static final String D_M_YYYY = "d-M-yyyy"; 
    private static final String DATE_SEPARATOR = "-"; 

    public static Date getDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     if (dd == null || mm == null || yyyy == null) 
      return null; 

     Date retVal = null; 
     try 
     { 
      retVal = DateTimeFormat.getFormat(D_M_YYYY).parse(dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy); 
     } 
     catch (Exception e) 
     { 
      retVal = null; 
     } 

     return retVal; 
    } 

    public static String getDayAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[0]; 
    } 

    public static String getMonthAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[1]; 
    } 

    public static String getYearAsString(Date date) 
    { 
     return (date == null) ? null : DateTimeFormat.getFormat(D_M_YYYY).format(date).split(DATE_SEPARATOR)[2]; 
    } 

    public static boolean isValidDate(Integer dd, Integer mm, Integer yyyy) 
    { 
     boolean isvalidDate = true; 

     try 
     { 
      String transformedInput = DateTimeFormat.getFormat(D_M_YYYY).format(getDate(dd, mm, yyyy)); 
      String originalInput = dd + DATE_SEPARATOR + mm + DATE_SEPARATOR + yyyy; 

      isvalidDate = transformedInput.equals(originalInput); 
     } 
     catch (Exception e) 
     { 
      isvalidDate = false; 
     } 

     return isvalidDate; 
    } 
} 
+0

Quels implémentations de tiers recommanderiez-vous? – Jla

+0

Je n'ai pas d'arithmétique de date complexe dans mon application, et par conséquent, je n'ai pas sérieusement recherché de bibliothèque de DateTime pour GWT. Je sais qu'il existe un utilitaire GwtDateTime (http://code.google.com/p/gwt-examples/wiki/gwtDateTime), mais ne l'ayant pas testé, ne peut pas le garantir. YMMV –

+0

Ceux-ci ne fonctionnent pas dans les tests unitaires :((sauf si vous étendez GWTTestCase qui est lent) –

2

Vous pouvez juste ajouter 1900-getYear() valeur de retour

1

I ne pensez pas que gwt supportera le calendrier dans le futur, peut-être pourrait-il supporter une autre implémentation de manipulation de date. Donc, parce que la recommandation java de ne pas utiliser Date n'est pas valide dans Gwt et que vous n'avez aucune autre option sans importer une bibliothèque tierce, la bonne façon est d'utiliser Date et d'ignorer les avertissements de dépréciation.

+0

Il y a quelques cas de bord qui échouent dans les getters obsolètes de Date. Il m'a fallu des heures pour localiser la source du bogue à une méthode getDate() sur la date, s Ince a ensuite cessé d'utiliser les méthodes Date.Je vous conseille fortement de tester soigneusement vos méthodes de date pour la plage de dates prévue avant le déploiement en production. –

24

La solution de contournement présentée par Ashwin fonctionne et ce n'est pas si difficile. Mais je suggère d'utiliser les modèles de date au lieu de fractionnement:

For date - 
DateTimeFormat.getFormat("d").format(new Date()) 

For month - 
DateTimeFormat.getFormat("M").format(new Date()) 

For year - 
DateTimeFormat.getFormat("yyyy").format(new Date()) 
+1

Je pensais la même chose. Pourquoi faire deux fois le travail? –

Questions connexes