另一个字符串未被识别为有效的日期时间和 XML 元素

本文关键字:时间 日期 XML 元素 有效 字符串 识别 另一个 | 更新日期: 2023-09-27 18:30:30

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

1/12/2012 and
2012

我收到错误

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

所以我四处阅读并尝试(我的 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 数据库中出生日期的类型是日期时间 - 但将其

更改为 NVARCHAR 可以解决问题,但这意味着一旦数据在数据库中,我就无法将其存储为有效的日期时间格式以执行日期时间操作。

有没有办法克服上述错误或格式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>";

另一个字符串未被识别为有效的日期时间和 XML 元素

好吧,看起来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() 而不是 .任意()

此外,在两个条件语句中,您只是返回今天的日期:

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);