Другая строка не была распознана как допустимый элемент DateTime и XML

1

У меня есть элемент 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>";
  • 0
    Какое значение имеет c.Element(ns + "date-span").Element(ns + "begin").Value ? Является ли это 1/12/2012 ?
  • 0
    Да - однако другая запись может иметь его как 2012 (без дня / месяца) из возвращенного XML
Показать ещё 2 комментария
Теги:
datetime

2 ответа

2
Лучший ответ

Ну, похоже, что перегрузка 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.

  • 0
    Мой код является частью запроса Linq, так как бы я изменил код, который я разместил? Если это не имеет смысла, я могу опубликовать фрагмент
  • 0
    @Computer Я не очень хорош в LINQ, но публикация вашего кода может быть полезной.
Показать ещё 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;

Таким образом, защитная кодировка в сторону, вы хотите, чтобы попытка синтаксического анализа выполнялась следующим образом:

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);  
  • 0
    Я пытался, как вы предложили, но опять же я не уверен, смогу ли я использовать Linq, как я. Код находится под Редактировать 1
  • 0
    @Компьютер, вы отправите фрагмент XML? Вы используете LINQtoXML?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню