У меня есть элемент XML, который содержит данные в следующем формате DATE (данные XML поступают из стороннего веб-сервиса, поэтому я не контролирую возвращенные данные)
1/12/2012 and
2012
Я получаю сообщение об ошибке
Строка не была признана действительной DateTime
Поэтому я читал и пытался (My С# не так эффективен, как VB.Net)
DateOfBirth = DateTime.TryParse(c.Element(ns + "date-span").Elements(ns + "begin").Any() ? c.Element(ns + "date-span").Element(ns + "begin").Value : DateTime.Now.ToString(), DateTime.Now.ToString());
но независимо от того, что я пытаюсь получить либо синтаксическую ошибку, либо строку не распознается.
Тип DateOfBirth в моей SQL-базе данных - это Datetime, но изменение этого параметра на NVARCHAR разрешает проблему, но это означает, что я не могу сохранить его как допустимый формат даты и времени для выполнения операций datetime, как только данные будут в базе данных.
Есть ли способ преодолеть вышеуказанную ошибку или формат 2012 года до 01/01/2012? Или единственный способ сделать это - сохранить его как NVARCHAR, а затем Convert.ToDateTime(valueFromDatabase), когда мне нужно делать операции с датой, которая была сохранена?
Редактировать 1
GetCustomers = from c in XDoc.Descendants(ns + "customer")
select
new Customer
{
Name = c.Element(ns + "name").Value,
DateOfBirth = Convert.ToDateTime(aa.Element(ns + "date-span").Elements(ns + "begin").Any() ? aa.Element(ns + "date-span").Element(ns + "begin").Value : DateTime.Now.ToString())
};
Изменить 2
var xml = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<metadata created=""2014-11-03T18:13:02.769Z"" xmlns=""http://example.com/ns/mmd-2.0#"" xmlns:ext=""http://example.com/ns/ext#-2.0"">
<customer-list count=""112"" offset=""0"">
<customer id=""5f6ab597-f57a-40da-be9e-adad48708203"" type=""Person"" ext:score=""100"">
<name>Bobby Smith</name>
<gender>male</gender>
<country>US</country>
<date-span>
<begin>1965-02-18</begin>
<end>false</end>
</date-span>
</customer>
<customer id=""22"" type=""Person"" ext:score=""100"">
<name>Tina Smith</name>
<gender>Female</gender>
<country>US</country>
<date-span>
<end>false</end>
</date-span>
</customer>
<customer id=""30"" type=""Person"" ext:score=""500"">
<name>George</name>
<gender>Male</gender>
<country>US</country>
<date-span>
<begin>1965</begin>
<end>false</end>
</date-span>
</customer>
</customer-list>
</metadata>";
Ну, похоже, что перегрузка DateTime.TryParseExact
которая принимает string[]
в качестве формата, может быть решением;
string s = "";
string[] format = new [] {"yyyy", "d/MM/yyyy"};
DateTime date;
if(DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
// Successfull parsing for 2012 and 1/12/2012
}
Я предполагаю, что ваша первая цифра в течение нескольких дней. Если это не так, вы можете добавить формат MM/d/yyyy
в свой массив строк. И если ваши дни и месячные части имеют начальные нули для отдельных цифр (например, 01/01/2012
), вам также нужен формат dd/MM/yyyy
.
Если вы знаете, какой формат вы указали, вы можете использовать перегрузку TryParseExact, которая позволяет использовать несколько форматов.
var year = "2012";
DateTime result;
DateTime.TryParseExact(year,new []{"yyyy", "dd/MM/yyyy"}, null,DateTimeStyles.None,out result);
Что касается LINQ, который вы опубликовали:.Any() означает 1 или больше, похоже, что вы хотите точно один или ничего... поэтому, возможно, используйте.SingleOrDefault() вместо.Any()
Кроме того, в обоих ваших условных заявлениях вы просто возвращаете сегодня дату:
var birthDate = condition: executes when condition true? executes when condition is false;
Таким образом, защитная кодировка в сторону, вы хотите, чтобы попытка синтаксического анализа выполнялась следующим образом:
DateTime birthDate;
var dateToParse = c.Element(ns + "date-span").Element(ns + "begin").Value;
DateTime.TryParseExact(dateToParse,new []{"yyyy", "dd/MM/yyyy"}, null,DateTimeStyles.None,out result);
c.Element(ns + "date-span").Element(ns + "begin").Value
? Является ли это1/12/2012
?