2015-03-09 1 views
1

У меня возникли некоторые проблемы, которые кажутся мне действительно странными, и я не могу начать осознавать, почему это происходит..NET DateTime Исключение для разбора партирования

В принципе, я пытаюсь сделать DateTime.ParseExact, который работает в одном случае, но не на другом.

Скажем, у меня есть эта строка в качестве строки даты:

"11/02/2015 11:59:06:313" 

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

DateTime.ParseExact("11/02/2015 11:59:06:313", "dd/MM/yyyy HH:mm:ss:fff", null); 

Теперь при размещении этого в качестве динамического значения (что я хочу) я получаю «Строка не распознается как допустимый формат DateTime», в этом коде:

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:fff", null); 

Я также попробовал метод Convert.ToDateTime (который выбросил же исключение):

Convert.ToDateTime(item.original).ToString("dd/MM/yyyy HH:mm:ss:fff"); 

«item.original» переменная приходит из класса (это строковое свойство этого класса, который определяется как

public class XmlData 
{ 
    public string tableName { get; set; } 
    public string columnName { get; set; } 
    public string original { get; set; } 
    public int required { get; set; } 
    public string status { get; set; } 
    public string type { get; set; } 
    public string newValue { get; set; } 
} 

Я действительно потерялся здесь. Имеет ли смысл, почему это происходит?

EDIT

Решил дать немного больше информации о том, как это используется, потому что, возможно, проблема возникает из-за дальнейшего.

У меня есть класс, который я использую для определения свойств, которые, используя отражение, будут создавать DataTable.

Класс обладает этим свойством:

public DateTime last_date { get; set; } 

Затем я использую этот метод, чтобы построить DataTable:

public DataTable CreateEmptyDataTable(Type myType) 
{ 
    DataTable dt = new DataTable(); 

    foreach (PropertyInfo info in myType.GetProperties()) 
    { 
     dt.Columns.Add(new DataColumn(info.Name, info.PropertyType)); 
    } 

    return dt; 
} 

После инициализации DataTable, я читаю значения из моего XMLDATA класса и используя следующий код для определения значения в столбце last_date следующим образом:

//Set the original state 
foreach (XmlData item in collection) 
{ 
    if (item.tableName == "vehicle") 
    { 
     if (item.original == "--NULL--") 
      dr[item.columnName.Substring(item.tableName.Length + 1)] = DBNull.Value; 
     else 
     { 
      if (item.type == "DT") //DateTime in format "dd/MM/yyyy HH:mm:ss:fff" 
       dr[item.columnName.Substring(item.tableName.Length + 1)] = DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null); 
      else 
       dr[item.columnName.Substring(item.tableName.Length + 1)] = Convert.ChangeType(item.original, dt.Columns[item.columnName.Substring(item.tableName.Length + 1)].DataType); 
     } 
    } 
} 
+3

Вы заменили 'null' на' CultureInfo.InvariantCulture'? –

+0

Строка, которую вы передали, не находится в формате ISO, поэтому ее интерпретировали как строку locat datetime. Я подозреваю, что ваш компьютер не использует этот длинный формат datetime. –

+0

Последний подход делает что-то другое, он не использует формат для синтаксического анализа строки, но для преобразования (надеюсь, разобранного) 'DateTime' обратно в строку. –

ответ

0

В случае, если кто-то интересно, то «решение» этой проблемы в том, чтобы создать экземпляр объекта DateTime деконструирует строку и назначая его на конструктору DateTime, как это:

string[] date = item.original.Split(' '); 
string[] datePart = date[0].Split('/'); 
string[] hourPart = date[1].Split(':'); 

DateTime newDateValue = DateTime.MinValue; 

if (hourPart.Length == 3) 
{ 
    newDateValue = new DateTime(Convert.ToInt32(datePart[2]), Convert.ToInt32(datePart[1]), Convert.ToInt32(datePart[0]), Convert.ToInt32(hourPart[0]), Convert.ToInt32(hourPart[1]), Convert.ToInt32(hourPart[2])); 
} 
if (hourPart.Length == 4) 
{ 
    newDateValue = new DateTime(Convert.ToInt32(datePart[2]), Convert.ToInt32(datePart[1]), Convert.ToInt32(datePart[0]), Convert.ToInt32(hourPart[0]), Convert.ToInt32(hourPart[1]), Convert.ToInt32(hourPart[2]), Convert.ToInt32(hourPart[3])); 
} 

Я говорю «решение» с цитаты, потому что я думаю, что это плохое решение, и, вероятно, это лучший способ, потому что эта операция относительно тяжелая, но по крайней мере она работает

4

Ваш формат верен.

Поскольку вы используете null как IFormatProvider, я сильно подозреваю, что ваш CurrentCulture имеют разные DateSeparator чем /или/и различных TimeSeparator чем : символов.

/ и : символы являются специальными в пользовательских синтаксических анализах даты и времени.Они означают, как: заменить меня на текущую дату культуры или разделитель времени

В вашем профиле, он говорит, что вы с португальцев, и текущая культура будет вероятно pt-PT. И эта культура имеет - как DateSeparator

+0

Компьютер, над которым я работаю, обладает структурой fr-BE (я думаю). Если это не так, это fr-FR. Для меня нет смысла в том, что с тем же самым точным кодом (IFormatProvider null), если строка жестко запрограммирована, все идет хорошо, но как только я использую эту строку, исходящую из свойства класса, я получаю ошибку. См. Мое редактирование. –

+0

Итак, ответ: либо используйте 'DateTime.ParseExact (« 11/02/2015 11: 59: 06: 313 »,« dd/MM/yyyy HH: mm: ss: fff », CultureInfo.InvariantCulture);' или 'DateTime.ParseExact (" 11/02/2015 11: 59: 06: 313 "," dd '/' MM '/' yyyy HH: mm: ss: fff ", null)' (апострофы вокруг). –

+0

Или используйте формат ISO, чтобы избежать интерпретаций –

3

Просто выстрел в темноте:

у вас есть рабочая HARDCODED значение,

DateTime.ParseExact("11/02/2015 11:59:06:313", "dd/MM/yyyy HH:mm:ss:fff", null); 

Но когда вы задаете значение для last_date колонки:

if (item.type == "DT") //DateTime in format "dd/MM/yyyy HH:mm:ss:fff" 
      dr[item.columnName.Substring(item.tableName.Length + 1)] = DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null); 
     else 
      dr[item.columnName.Substring(item.tableName.Length + 1)] = Convert.ChangeType(item.original, dt.Columns[item.columnName.Substring(item.tableName.Length + 1)].DataType); 

не должно быть

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:fff", null); 

вместо

DateTime.ParseExact(item.original, "dd/MM/yyyy HH:mm:ss:FFF", null); 

?

+0

, это одна из вещей, которые я заметил сначала, но результат тот же. –