2017-09-14 34 views
0

假設像在C#以下的類:格式字符串格式的日期時間在C#模型屬性

[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; } 
    } 

這將是非常有益的,我要能格式化的都是字符串類型的DateTime數據將特定日期時間字符串格式的屬性稱爲「dd-MMM-yyyy」。是否有可能通過屬性來實現這一點? 我曾嘗試下面的代碼沒有成功:

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

回答

1

我有一些規則處理DateTime是否。沒有特定的順序:

  • 總是存儲和檢索UTC日期時間。讓最終用戶的ToString函數決定將本地時區和格式顯示爲。如果你可以避開它/把它留給其他人,你真的不想要deal with Timezones。明顯的例外是Web服務器。
  • 因此,也總是使用DateTime - 僅靠日期是不夠的。如果你告訴我這是「十二月二十七日」,我可以告訴你高達23/24的世界不同意。在某些情況下可能需要幾天時間(時區可能非常奇怪)
  • 從不存儲,讀取或傳輸日期時間爲字符串(如果可以避免)。如果有內部格式,請始終使用它。
  • 如果由於某種原因您必須將其作爲字符串(XML,Serialsiation)傳輸,請始終選擇固定的字符串編碼和格式以便在所有Ends處使用。 XML通常會處理編碼(它使用了編碼)。我不確定其他串聯技術。

對於您的具體情況: 我不會公開DateTime作爲字符串開始。我會公開它作爲DateTime實例。將它轉換爲字符串應留給GUI和Serialize/Deseriablize函數。

我甚至可能會考慮將DateTime轉換爲Tick計數(effectivel是一個大整數),如果我認爲它將始終是另一端的另一個.NET應用程序。自然地,用JSON你可以想要像字符串那樣的東西。

+0

謝謝你的觀點。我同意所有這些,但問題在於我不是代碼的作者,也不是數據的設計者。這是交給我的,解決它是一個痛苦。整個解決方案是一個巨大的黑客攻擊。數據甚至不會動態生成。數據來自CMS或由第三方手動提供,我無權擅自更改來源。所以,這就是我首先提出這個問題的原因。 – user843681

0

我通過創建一個自定義的Json轉換器解決了這個問題。

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) 
     { 

     } 
    } 

然後你可以使用它像這樣:

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

DateTimeFormatter是一個擴展方法。

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

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

      return possibleDatetime; 
     }