2013-07-07 3 views
4

Quelle est la pratique préférée pour gérer le format DateTime entre client (javascript, ajax) et serveur (ASP MVC) pour une demande internationale?Faire face au format DateTime pour une application internationale

Sur la base de mes recherches:

  • Format du serveur: aaaa-mm-jj
  • client Format: aaaa-mm-jj

Ecraser le liant modèle DateTime de l'ASP MVC avec la coutume liant modèle comme

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     try 
     { 
      var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
      return value.ConvertTo(typeof(DateTime), CultureInfo.InvariantCulture); 
     } 
     catch (Exception ex) 
     { 
      return new DateTime(); 
     } 
    } 

et formater la date à côté client par:

function toISOString(d) { 
     var year = d.getFullYear(); 
     var month = d.getMonth() + 1; 
     var date = d.getDate(); 
     return year + '-' + month + '-' + date; 
    } 

et une dernière question - ayant mis ce qui précède, comment le serveur vérifier le décalage DateTime ou Décalage horaire du client si cela doit prendre pour compte avant d'entrer dans l'application?

+1

S'il vous plaît vérifier la version de Wikipédia de la spécification [ISO8601] (http://en.wikipedia.org/wiki/ISO_8601) pour voir comment vous êtes censé traiter fuseaux horaires lorsque la valeur de la date et de l'heure est formatée selon ISO-8601 (UTC - 2013-07-06T02: 28Z ou avec fuseau horaire ... 2013-07-06T09: 28 + 07: 00) –

+1

L'ISO est la voie à suivre. :) Et si vous envisagez de faire beaucoup d'autre chose avec la mise en forme de la date du côté client, jetez un oeil à [moment.js] (http://momentjs.com/). –

Répondre

4

La sortie en tant que chaîne ISO est la bonne façon de procéder.

Il vous sera probablement utile d'utiliser le code Date de toISOString. Comme tous les navigateurs ne le supporte, vous voulez fournir pour les navigateurs qui ne sont pas:

if (!Date.prototype.toISOString) { 
    (function() { 

    function pad(number) { 
     var r = String(number); 
     if (r.length === 1) { 
     r = '0' + r; 
     } 
     return r; 
    } 

    Date.prototype.toISOString = function() { 
     return this.getUTCFullYear() 
     + '-' + pad(this.getUTCMonth() + 1) 
     + '-' + pad(this.getUTCDate()) 
     + 'T' + pad(this.getUTCHours()) 
     + ':' + pad(this.getUTCMinutes()) 
     + ':' + pad(this.getUTCSeconds()) 
     + '.' + String((this.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) 
     + 'Z'; 
    }; 

    }()); 
} 

qui est pris directement à partir MDN toISOString. Je l'utilise, et j'espère que la plupart des autres le sont aussi.

Notez que Z correspond à l'heure Zulu (GMT). Vous pouvez simplement utiliser minuit (T00:00:00.000Z) pour indiquer l'heure. Personnellement, j'ai tendance à ne pas me soucier de la partie en millisecondes pour ce que je fais et je l'omets (la résolution temporelle va bien jusqu'à la seconde).

Tant que vous utilisez le format ISO, vous pouvez facilement écrire des analyseurs simples pour le serveur et le client, si nécessaire.

En ce qui concerne la liaison DateTime dans MVC, vous devez ensuite analyser la valeur entrante à l'aide des méthodes described in this answer. La clé de l'analyse de date/heure est la cohérence, et aussi longtemps que vous pouvez compter sur le format ISO (soit avec le T ou en utilisant un espace), vous pouvez facilement le gérer.

+0

merci! J'ai essayé le javascript toISOString() et testé qu'il ne fonctionnait pas sur certains navigateurs. Merci pour cela! –

+0

une question, le code ci-dessus devrait être collé après document prêt? ou ... –

+1

Le code ci-dessus doit être collé avant d'utiliser 'toISOString'. Cela n'a pas vraiment besoin d'être prêt car cela n'affecte pas le document/la structure (vous pouvez donc le stocker dans un fichier de script chargé sur chaque page qui en a besoin). Vous serez probablement intéressé par ce qu'on appelle ["polyfills"] (https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills). – pickypg

0

dateFormat(new Date(), 'Y-m-dTH:i:s.uZ'); // Returns 2013-06-07T04:22:26.755

https://gist.github.com/poying/5942293

var dateFormat = (function() { 
    var keywords = { 
     Y: 'getFullYear', 
     m: 'getUTCMonth', 
     d: 'getUTCDate', 
     H: 'getUTCHours', 
     i: 'getUTCMinutes', 
     s: 'getUTCSeconds', 
     u: 'getUTCMilliseconds' 
    }; 
    function pad(number) { 
     var r = String(number); 
     if (r.length === 1) { 
      r = '0' + r; 
     } 
     return r; 
    } 
    return function dateFormat(date, format) { 
     var str = ''; 
     var i, len = format.length; 
     for (i = 0; i < len; i += 1) { 
      if (keywords.hasOwnProperty(format[i])) { 
       str += pad(Date.prototype[keywords[format[i]]].call(date)); 
      } else { 
       str += format[i]; 
      } 
     } 
     return str; 
    } 
})(); 
Questions connexes