2017-09-14 1 views
0

Supposons une classe comme suit dans C#:Chaîne de format en temps de date formatée dans un modèle C# propriété

[Serializable] 
    [JsonObject] 
    public class HistoricalValue 
    { 
     [JsonProperty("record_date")] 
     public string RecordDate { get; set; } 

     [JsonProperty("pay_date")] 
     public string PayDate { get; set; } 

     [JsonProperty("ex_div_date")] 
     public string ExDivDate { get; set; } 
    } 

Il me serait extrêmement bénéfique pour nous d'être en mesure de formater les données DateTime qui sont de type chaîne dans les propriétés à un format de chaîne de date-heure spécifique disons "jj-MMM-aaaa". Est-il possible d'atteindre cet objectif grâce à des attributs? J'ai essayé le code suivant sans succès:

[DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString ="{0:dd-MMMM-yyyy}")] 
    public string PayDate { get; set; } 

Répondre

1

J'ai quelques règles de manipulation DateTimes. Dans aucun ordre particulier:

  • Toujours stocker et récupérer l'UTC DateTime. Laissez la fonction ToString à l'utilisateur final décider du fuseau horaire local et du format pour l'afficher. Vous ne voulez vraiment pas deal with Timezones si vous pouvez l'éviter/laisser à quelqu'un d'autre. Les exceptions évidentes sont les serveurs Web.
  • Pour cette raison, utilisez également toujours DateTime - Date seule ne suffit pas. Si vous me dites que c'est "27 décembre" je peux vous montrer jusqu'à 23/24ème du monde qui n'est pas d'accord. Dans certains cas de plusieurs jours (les fuseaux horaires peuvent être vraiment bizarre)
  • Ne jamais stocker, lire ou transmettre un DateTime en tant que chaîne si vous pouvez l'éviter. S'il y a un format interne, utilisez-le toujours à la place.
  • Si, pour une raison quelconque, vous devez le transmettre sous forme de chaîne (XML, Sérialisation), choisissez toujours un codage de chaîne et un format fixes à utiliser à toutes les extrémités. XML traitera généralement de l'encodage (il porte l'encodage utilisé). Je ne suis pas sûr des autres techniques de sérialisation.

Pour votre cas spécifique: Je n'exposerais pas le DateTime en tant que chaîne pour commencer. Je l'exposerais en tant qu'instance DateTime. La conversion en chaînes doit être laissée à la GUI et à la fonction Serialize/Deseriablize.

Je pourrais même envisager de transmettre le DateTime en tant que compte Tick (effectivel un grand Integer) si je suppose que ce sera toujours une autre application .NET à l'autre extrémité. Naturellement avec JSON, vous voulez probablement quelque chose comme des chaînes à la place.

+0

Nous vous remercions de vos remarques. Je suis d'accord avec chacun d'eux, mais le problème ici est que je ne suis pas l'auteur du code et ni le concepteur des données. Cela me est remis et c'est une douleur de contourner le problème. La solution entière est un hack géant. Les données ne sont même pas générées dynamiquement. Les données proviennent d'un CMS ou fournies manuellement par un tiers que je n'ai pas le privilège de changer à la source. Donc, c'est la raison pour laquelle je pose la question pour commencer. – user843681

0

J'ai résolu ce problème en créant un convertisseur JSON personnalisé.

public class JsonDateTimeConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return (objectType == typeof(string)); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      return reader.Value.ToString().DateTimeFormatter("dd-MMM-yyyy"); 
     } 

     public override bool CanWrite 
     { 
      get { return false; } 
     } 


     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 

     } 
    } 

Ensuite, vous pouvez l'utiliser comme ceci:

 [JsonProperty("inception_date")] 
     [JsonConverter(typeof(JsonDateTimeConverter))] 
     public string InceptionDate { get; set; } 

DateTimeFormatter est une méthode d'extension.

public static string DateTimeFormatter(this string possibleDatetime, string format) 
     { 

      DateTime result; 
      if(DateTime.TryParse(possibleDatetime, out result)) 
      { 
       return result.ToString(format); 
      } 

      return possibleDatetime; 
     }