2

日付の文字列表現を日時オブジェクトに変換する際に問題に直面しています。私の文字列は"2013424"次のコードを使用して文字列を日時に変換すると失敗します..

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

dtAnswerDate には、文字列値の変換された表現が含まれていません。

しかし、私の文字列がそのような値を持っている場合、"20130424"それはうまく機能します。可能な提案はありますか?

値は、私のコードで XPath 式を使用して Microsoft HealthVault から取得されます。この 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」を返します

4

2 に答える 2

1

最善の解決策は、月を変換する前に 2 桁の表現を取得することです。もちろん、元の日付のさまざまな部分を連結していて、元の日付が提供されていないと仮定しています2013424(日付があいまいになります)。

つまり、次のようなものです。

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

アップデート:

なぜ mont を単独でフェッチできないのかはまだ少しわかりませんが、実際にそうである場合は、基本的に適切な解決策はありません。あいまいな日付の例を次に示します2013111, 2013211, 2013129

特定の数字が月または日の表現の一部であるかどうかがわからない場合、日付を安全に解析することはできません。

これには、あなたが言及していない他のロジックがあるのでしょうか? 数字がどのように解釈されるべきかを安全に「推測」する方法を考えられますか? それとも、何らかの方法でユーザーが使用できる XPath 式を制限または操作できますか?

そうでない場合は、問題に対する安全な解決策がまったくないのではないかと思います。

于 2013-04-24T10:28:57.907 に答える