日期时间格式问题

时间:2013-04-24 10:14:13

标签: c# datetime datetime-format

我在将date的字符串表示转换为datetime对象时遇到了困难。我的字符串是"2013424",如果我使用以下代码将字符串转换为datetime,那么它就会失败..

string format = "yyyyMd";
DateTime.TryParseExact("2013424", format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dtAnswerDate);
  

dtAnswerDate不包含字符串的转换表示   值。

但是如果我的字符串具有"20130424"之类的值,那么它可以正常工作。有什么可能的建议吗?

该值来自Microsoft HealthVault,在我的代码中使用XPath表达式。此XPath表达式由最终用户提供。 XPath表达式选择一个节点并使用InnerText属性返回值。我正在编写以下代码供参考。

string strItemXML = healthRecordItem.GetItemXml();
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(strItemXML);
XmlNode xpathNode = xDoc.SelectSingleNode(xpath);
When = healthRecordItem.LastUpdated != null ? healthRecordItem.LastUpdated.Timestamp : healthRecordItem.EffectiveDate;
if (xpathNode != null)
{
    return xpathNode.InnerText;
}

'strItemXML'包含以下XML

`<thing>  
<thing-id version-stamp="a40f8c41-0329-4b0f-af56-33040a1f3ecf">de631835-c7b6-43dd-9ae9-528c26ab2204</thing-id>  
<type-id name="Appointment">4b18aeb6-5f01-444c-8c70-dbf13a2f510b</type-id>  
<thing-state>Active</thing-state>  
<flags>0</flags>  
<eff-date>2013-04-23T14:33:00Z</eff-date>  
<created>  
<timestamp>2013-02-15T12:48:42.74Z</timestamp>  
<app-id name="InstantPHR Personal Health Record">afc8707e-c160-4b7f-9856-69d5c790b1a9</app-id>  
<person-id name="Mohammed Owes">f848a184-878d-4cef-999f-dff54d2e5db2</person-id>  
<access-avenue>Online</access-avenue>  
<audit-action>Created</audit-action>  
<master-app-id>8df99894-5f36-489a-a8fd-ffe6b25b8efb</master-app-id>  
</created>  
<updated>  
<timestamp>2013-04-24T07:44:58.38Z</timestamp>  
<app-id name="InstantPHR Personal Health Record">afc8707e-c160-4b7f-9856-69d5c790b1a9</app-id>  
<person-id name="Mohammed Owes">f848a184-878d-4cef-999f-dff54d2e5db2</person-id>  
<access-avenue>Online</access-avenue>  
<audit-action>Updated</audit-action>  
<master-app-id>8df99894-5f36-489a-a8fd-ffe6b25b8efb</master-app-id>  
</updated>  
<data-xml>  
<appointment>  
<when>  
<date>  
<y>2013</y>  
<m>4</m>  
<d>24</d>  
</date>  
<time>  
<h>14</h>  
<m>33</m>  
<s>0</s>  
</time>  
</when>  
<service>  
<text>RREEESSSTTTT</text>  
</service>  
<clinic>  
<name>  
<full>Mohammed Owes</full>  
</name>  
</clinic>  
</appointment>  
<common>  
<source>InstantPHR</source>  
<extension source="phr.getrealconsulting.com.appointment_v2"/>  
</common>  
</data-xml>  
</thing>`  

和'xpath'值是“/ thing / data-xml / appointment / when / date”。所以我的代码将返回“2013424”

2 个答案:

答案 0 :(得分:3)

<强>更新

看起来你在那个xml中分隔了值。

您可以通过分别提取年,月和日并将其提取到带有这三个参数的DateTime构造函数中来完全避免解析:

var date = new DateTime(year, month, day);

不幸的是,我对XPath不太热,所以你必须自己修改那部分。


我认为这里的问题是数字进入月份或日期的潜在模糊性。我知道你使用的日期作为一个例子实际上并不含糊,但它仍然失败,因为潜力仍然存在。

例如:2013111。这是11月1日还是1月11日?这就是前导0起作用的原因,因为它可以分隔数字以消除歧义。

除非您添加空格或指定前导零,否则我认为无法使此格式生效。

白色空间示例:

string format = "yyyy M d";
DateTime date = DateTime.ParseExact("2013 4 24", format, CultureInfo.InvariantCulture);

您尚未说明任何限制或“2013424”值的来源,因此我无法轻易提出解决此问题的方法。

当然,如果你没有从输入的角度以非模糊格式捕捉到值,你也会遇到这些模棱两可的问题试图理解什么是一天什么是一个月。

供参考,you can find the documentation for DateTime format strings here

答案 1 :(得分:1)

您最好的解决方案可能是确保在尝试转换之前获得当月的两位数字表示;我当然假设您正在连接原始日期的各个部分,并且最初没有提供2013424(这会使日期模糊不清)。

我喜欢的东西:

var monthString = (monthString.length > 1) ? "0" + monthString : monthString;    
var dateString = yearString + monthString + dayString;
DateTime.TryParseExact(dateString, out dtAnswerDate); 

更新

我仍然有点不清楚为什么你不能自己取mont,但如果实际上是这样,那么你基本上没有好的解决方案。以下是模糊日期的示例:2013111, 2013211, 2013129

如果您不知道某个特定数字是一个月或一天的代表的一部分,您根本无法安全地解析日期。

是否还有其他一些逻辑,你还没有提到过?您能想出任何方法来安全地“猜测”数字应该如何解释吗?或者您可以限制或操纵用户可以某种方式使用的XPath表达式?

如果没有,那么我担心你的问题没有安全的解决办法。

相关问题