我有一个XML元素,其中包含以下DATE格式的数据(XML数据来自第三方Web服务,因此我无法控制返回的数据)
1/12/2012 and
2012
我收到错误
字符串未被识别为有效的DateTime
所以我四处阅读并尝试过(我的C#并不像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());
但无论我尝试什么,我得到语法错误或字符串无法识别。
我的SQL DB中DateOfBirth的类型是Datetime - 但是将其更改为NVARCHAR可以解决问题但这意味着我无法将其存储为有效的日期时间格式,以便在数据存储在数据库中时执行日期时间操作。
有没有办法克服上述错误或格式化2012年至2012年1月1日?或者,当我需要对已保存的日期进行操作时,唯一的方法是将其存储为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>";
答案 0 :(得分:2)
好,看起来像DateTime.TryParseExact
overload,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
格式。
答案 1 :(得分:1)
如果您知道格式是您列出的,那么您可以使用允许多种格式的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;
所以,除了防御性编码之外,你希望try解析完全像:
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);