2016-08-15 21 views
-1

我有以下代碼:如何設置類的XmlElement C#默認的DateTimeOffset值

public sealed class MyClass 
{ 
    [XmlElement("Remind")] 
    public string lastUpdatedTimeForXml2 
    { 
     get { return Remind.ToString("yyyy-MM-ddTHH:mm:ss"); } 
     set { Remind = DateTimeOffset.Parse(value); } 
    } 
    [XmlIgnore] 
    public DateTimeOffset Remind { get; set; } 
} 

而我的問題是,當不存在提醒值在文件中它是由0001-01-01T00替換它:00:00並在線崩潰:「set {Remind = DateTimeOffset.Parse(value);}」

編輯。

好吧,我解決了這個問題做這樣的事情:

[XmlElement("Remind")] 
    public string lastUpdatedTimeForXml2 
    { 
     get { return Remind.ToString("yyyy-MM-ddTHH:mm:ss"); } 
     set 
     { 
      if (value == "0001-01-01T00:00:00") 
       Remind = DateTimeOffset.MinValue; 
      else 
       Remind = DateTimeOffset.Parse(value); 
     } 
    } 
    [XmlIgnore] 

現在沒有崩潰,但我不知道爲什麼。這是最好的解決方案?

+0

你是在東半球嗎?您會收到異常消息_日期的UTC表示落在年度範圍1-9999._之外,是嗎?你期待什麼時區? (如果需要,你可以使用'TryParse'。) –

回答

1

新增前言:當您解析字符串像"0001-01-01T00:00:00"它沒有時區的線索,當你的計算機的本地時區是在東半球(比UTC)的,潛在的UTC值將是前一年的某處到0001年,這是不支持的。您將收到一條異常消息:

日期的UTC表示超出了1-9999的年份範圍。


這是很難回答,如果你不指定你想要什麼。一種可能性是:

set { Remind = DateTimeOffset.Parse(value, null, DateTimeStyles.AssumeUniversal)); } 

這將改變字符串值沒有給出時區信息時假定的時區。

另一種選擇是:

set 
{ 
    DateTimeOffset remind; 
    DateTimeOffset.TryParse(value, out remind); 
    Remind = remind; 
} 

將 「回落」 到default(DateTimeOffset)當解析失敗。

您是否希望進行某種「往返」操作,以使get訪問器生成的字符串可以返回到set訪問器?在這種情況下,你可能應該改變格式"yyyy-MM-ddTHH:mm:ss"在getter中包含時區信息?


加入您的評論後,我認爲你應該使用Remind.ToString("o"),如果你不想失去信息。 The standard format string "o"是爲了往返(而不是丟失信息)。

+0

其實我改變格式爲「yyyy-MM-ddTHH:mmzzz」,現在所有的東西都沒有額外的代碼。謝謝。 – GoOx

+1

@GoOx我更新了答案;我想你應該用'「o」'來代替。 –