Строка не была распознана как действительный DateTime. Что не так?

Я получаю досадную ошибку и не могу понять, почему это происходит. У меня есть XML-файл, где я храню данные, как показано ниже.

- <EmployeeFinance>
  <EmployeeEmploy_Id>5584</EmployeeEmploy_Id> 
  <EmpPersonal_Id>30358</EmpPersonal_Id> 
  <No_DaysWorked>30</No_DaysWorked> 
  <Date_Appointment>17/02/2012</Date_Appointment> 
  <Date_Employment>02/05/1984</Date_Employment> 
  <Date_Termination>01/01/0001</Date_Termination> 
  <Payperiod_StartDate>01/01/2013</Payperiod_StartDate> 
  <Payperiod_EndDate>31/01/2013</Payperiod_EndDate> 
  <BatchNumber>38</BatchNumber> 
  <PAYE_ToDate_Computed>0</PAYE_ToDate_Computed> 
  <Income_Tax_RateID>0</Income_Tax_RateID> 
  <NIS_RateID>0</NIS_RateID> 
  <NIS_weeks_worked>0</NIS_weeks_worked> 
  </EmployeeFinance>

Если вы посмотрите на узлы даты, Payperiod_StartDate,Payperiod_EndDate, Date_Appointment и т. Д. Все они имеют одинаковый формат. Теперь в моем коде C#, когда я пишу свой запрос для выбора из файла XML, я получаю, что строка не была распознана как допустимая ошибка DateTime. Когда я закомментирую все остальные даты и оставлю start_date, это работает. Они в одном формате, я не вижу, что я делаю неправильно. Пожалуйста, помогите мне.

    var context = new SSPModel.sspEntities();
    XElement xelement = XElement.Load(GlobalClass.GlobalUrl);
    XDocument doc = XDocument.Load(GlobalClass.GlobalUrl);

    var query = from nm in xelement.Elements("EmployeeFinance")
                select new EmployeeEmploy
                {
                    Employee_Personal_InfoEmp_id = (int)nm.Element("EmpPersonal_Id"),
                    Substantive_designation = (int)nm.Element("Position_Id"),
                    Grade_Id = (int)nm.Element("Grade_Id"),
                    PositionTotal_PtBasic = (double)nm.Element("Sum_AllPosition"),//part of basic
                    GradeTotal_PtBasic = (double)nm.Element("Sum_AllGrade"), //part of basic
                    Housing_Allowance = (double)nm.Element("Housing"),
                    Base_Pay = (double)nm.Element("Base_Pay"),
                    startDate = (DateTime)nm.Element("Payperiod_StartDate"),
                    endDate = (DateTime)nm.Element("Payperiod_EndDate"),
                    Date_of_Appointment = (DateTime)nm.Element("Date_Appointment"),
                   Date_of_Employment = (DateTime)nm.Element("Date_Employment"),
                    Termination_date_actual = (DateTime)nm.Element("Date_Termination"),
                    Base_Pay_Currency = (string)nm.Element("Currency"),
                    Exchange_rate = (double)nm.Element("Exchange_Rate")
                };
    var x = query.ToList();
    foreach (var xy in x) {
        Debug.WriteLine(xy.endDate);
    }

2 ответа

Так как 17/02/2012 не является действительной датой, однако, 02/17/2012 является. Дата будет проанализирована как mm/dd/yyyy, Одним из вариантов является использование DateTime.ParseExact для анализа даты с dd в качестве первого набора чисел. например

var startDate = DateTime.ParseExact("17/02/2012", "dd/MM/yyyy", null);

Отладчик покажет вам, что nm.Element("Payperiod_EndDate").ToString() выдает строку, содержащую теги xml для этого элемента. Вместо этого попробуйте следующее:

startDate = DateTime.ParseExact(nm.Element("Payperiod_EndDate").Value, "dd/MM/yyyy", null)

Другие вопросы по тегам