2016-08-15 20 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”'来代替。 –