C# 另一个字符串未被识别为有效的DateTime和XML元素

C# 另一个字符串未被识别为有效的DateTime和XML元素,c#,.net,xml,datetime,C#,.net,Xml,Datetime,我有一个XML元素,其中包含以下日期格式的数据(XML数据来自第三方web服务,因此我无法控制返回的数据) 我发现了错误 字符串未被识别为有效的日期时间 所以我四处阅读并尝试(我的C#没有VB.Net那么高效) 但无论我尝试什么,我要么得到语法错误,要么字符串无法识别 我的SQL DB中DateOfBirth的类型是Datetime,但将其更改为NVARCHAR可以解决问题,但这意味着我无法将其存储为有效的Datetime格式,以便在数据进入数据库后执行Datetime操作 是否有办法克服上述错

我有一个XML元素,其中包含以下日期格式的数据(XML数据来自第三方web服务,因此我无法控制返回的数据)

我发现了错误

字符串未被识别为有效的日期时间

所以我四处阅读并尝试(我的C#没有VB.Net那么高效)

但无论我尝试什么,我要么得到语法错误,要么字符串无法识别

我的SQL DB中DateOfBirth的类型是Datetime,但将其更改为NVARCHAR可以解决问题,但这意味着我无法将其存储为有效的Datetime格式,以便在数据进入数据库后执行Datetime操作

是否有办法克服上述错误或将2012年1月1日改为2012年1月1日?或者,唯一的方法是将其存储为NVARCHAR,然后在需要对已保存的日期执行操作时转换.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>";
var xml=@”
博比-史密斯
男性的
美国
1965-02-18
假的
蒂娜史密斯
女性
美国
假的
乔治
男性
美国
1965
假的
";
好吧,看起来这需要
字符串[]
作为一种格式,可以作为一种解决方案

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/yyy
格式。如果您的日和月部分有个位数的前导零(如
01/01/2012
),您还需要
dd/MM/yyyyy
格式。

如果您知道格式是您列出的格式,那么您可以使用允许多种格式的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=条件:当条件为真时执行?当条件为false时执行

因此,抛开防御性编码不谈,您希望try parse exact像这样运行:

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的值是多少?是否为
2012年12月1日
?是-但是另一条记录可能仅为2012年(无日/月)从XML返回的日期为
2012年12月1日
表示2012年12月1日或2012年1月12日?这意味着2012年12月1日我的代码是Linq查询的一部分,因此我如何修改我发布的代码?如果这不合理,我可以发布一个snippet@Computer我不擅长LINQ,但是发布你的代码片段会很有帮助。我按照你的建议做了尝试,但是我不确定我是否可以像现在这样使用LINQ。代码正在编辑中1@Computer您能发布一段xml吗?你在使用LINQtoXML吗?我在编辑2下添加了im使用的XML。是LinqToXML
var year = "2012";
DateTime result;
DateTime.TryParseExact(year,new []{"yyyy", "dd/MM/yyyy"}, null,DateTimeStyles.None,out result); 
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);