2013-04-24 5 views
1

Я столкнулся с трудностью преобразования строкового представления даты в объект datetime. Моя строка "2013424" и если я использую следующий фрагмент кода, чтобы преобразовать строку в дату, то он терпит неудачу ..Проблемы с форматом даты и времени

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' является "/ вещь/данных XML/назначение/когда/дата". Так что мой код будет возвращать вас «2013424»

+0

Вы не указали язык, вы не предоставили себе достаточный рабочий пример для людей, чтобы помочь вам, пожалуйста, отредактируйте свой ответ. – BlueTrin

+0

Вы можете найти множество способов форматирования строки, чтобы проверить эту страницу: http://www.csharp-examples.net/string-format-datetime/ –

+0

Вы можете найти много способов форматирования строки, проверьте эту страницу: http: // www.csharp-examples.net/string-format-datetime/ или используйте string.format http://msdn.microsoft.com/en-us/library/system.string.format.aspx –

ответ

3

Update

Похоже, у вас есть значения, разделенные в том, что XML.

Вы можете избежать разбора в целом, извлекая год, месяц, день и отдельно и подкормки, что в DateTime конструктор, который принимает эти три аргумента:

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

К сожалению, я не слишком жарко на XPath так вам придется самостоятельно изменить эту часть.


Я думаю, что проблема здесь заключается в потенциальной двусмысленности в отношении того, какие числа идут в месяц или день. Я знаю, что дата, которую вы используете в качестве примера, на самом деле не является двусмысленной, но она все еще терпит неудачу, потому что потенциал все еще существует.

Например: 2013111. Это 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.

+0

Я отредактировал свой вопрос и также объяснил, откуда взялось это значение. Возможно, сейчас достаточно понять ситуацию –

+0

У меня возникла ваша идея, но я не могу использовать эту опцию, так как код для возврата значения InperText Xpath является общим, который может возвращать значение даты, значение строки, целочисленное значение и т. Д. Я не могу дать пользователю три разных XPath, так как там это только одно текстовое поле для ввода пользователем XPath для извлечения значения.Таким образом, пользователь может либо ввести «/ thing/data-xml/meeting/when/date/y» в течение года, либо он может ввести «/ thing/data-xml/meeting/when/date», чтобы получить полное внутреннее текстовое значение, которое включает год, месяц и дату. –

1

Ваше лучшее решение, вероятно, чтобы вы получили двузначное представление месяца, прежде чем пытаться его преобразовать; Я предполагаю, конечно, что вы объединяете различные части исходной даты и что она не предоставляется как 2013424 изначально (это сделало бы дату неоднозначной).

Т.е. что-то вроде:

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

Update:

Это еще немного непонятно мне, почему вы не можете получить Монт сам по себе, но если это действительно так, то в принципе не подходит для вас. Ниже приводятся примеры двусмысленных дат: 2013111, 2013211, 2013129.

Вы просто не можете безопасно разобрать дату, если вы не знаете, какая конкретная цифра является частью представления месяца или дня.

Возможно, существует какая-то другая логика, о которой вы не упомянули? Можете ли вы придумать какой-либо способ безопасно «угадать», как следует интерпретировать цифру? Или, может быть, вы можете ограничить или манипулировать выражением XPath, которое пользователь может каким-то образом использовать?

Если нет, то, боюсь, просто нет безопасного решения вашей проблемы.

+0

Я не могу отформатировать месяц до двухзначного представления, поскольку значение приходит из другого источника, как указано в моей отредактированной версии вопроса. –

+0

Я обновил свой ответ (хотя это, вероятно, не совсем то, на что вы надеялись ..: \) – Kjartan

+0

Да, но по крайней мере я узнал, что я не могу представить свою строку для объекта datetime, если я не использую двузначное представление для месяц или использовать разделитель между годом, месяцем и датой. Еще благодарю вас за то, что вы сообщили мне, что нет способа делать то, что я хотел сделать. –