2013-05-22 2 views
-2

Я пытаюсь получить подстроку из поля datetime. Я получаю это поле из набора данных, как это:Как я могу получить строку из поля dateTime в C#

fecha_nacimiento = row[7].ToString().Substring(1,9); 

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

start index can´t be longer that length of string.

Я повторяю, что значение строки [ 7] .ToString является 11/11/2010 0:00:00

+0

Попробуйте распечатать строку [7] .ToString() и посмотреть, что вы получаете – ose

+0

Что вы пытаетесь получить exaccty? 'DateTime.ToString()' предоставляет лучшие способы форматирования даты –

+1

, очевидно, что 8-я строка имеет длину 1 или меньше – apomene

ответ

2

Поставьте точку останова на этой линии и добавить часы для этого значения:

row[7].ToString() 

мне кажется, что он пуст.

Этот код поможет поймать это:

string date = row[7].ToString(); 
if (!String.IsNullOrEmpty(date) && date.Length > 8) 
{ 
    fecha_nacimiento = date.Substring(1,9); 
} 

В комментариях показали, однако, есть более эффективные способы разбора даты!

0

Вы можете попробовать использовать шаблон в методе «ToString()»

Вы можете выбрать один из многих существующего формата. Смотрите официальную документацию здесь

http://msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.80).aspx

Как это:

string fecha_nacimiento = string.Empty; 

if(row[7] != null) 
{ 
    if(row[7].toString() != string.Empty) 
    { 
     string fecha_nacimiento = row[7].ToString("yyyy-MM-dd hh:mm"); 
     //OR 
     string fecha_nacimiento = row[7].ToString("yyyy-MM-dd"); 
     // etc... 
    } 
} 
+0

Вы можете, но это также провалится, если строка [7] нулевая или пустая? –

+0

Да, конечно. Но это еще одна проблема. Если вы используете подстроку, это та же проблема. Вы можете проверить, не осталось ли значение до получения даты. i edit my answer –

+0

Это будет работать, только если во время компиляции известно *, что 'row [7]' имеет тип DateTime. 'object' не имеет' .ToString() 'перегрузки с параметром формата. –

0

Это означает, что row[7].ToString() имеет длину 0.

Просто доказать свою точку зрения, если вы:

string test = string.Empty; 

Console.WriteLine(test.Substring(1, 9)); 

Это даст вам точные данные ame сообщение об ошибке.

1

Во-первых, эта ошибка означает, что у вас есть строка, которая либо пустая, либо одна символьная длина - она ​​не имеет символа в позиции 1 (помните, что они начинаются с индекса 0).

Во-вторых, если данные в этой ячейке является DateTime уже, а затем использовать один из DateTime методов, чтобы получить строку (ToString, ToShortDateString или ToLongDateString) вам нужно. Как это:

fecha_nacimiento = ((DateTime)row[7]).ToShortDateString(); 

EDIT Casting не является необходимым, если вы просто хотите использовать метод ToString.

В противном случае, сначала parse это значение DateTime, затем используйте один из этих методов.

1

Как вы уже доказали, строка содержит «22/11/2010 0:00:00». Используйте

row[7].ToString("d") which will result in "22/11/2010" 

здесь: http://msdn.microsoft.com/de-de/library/zdtaw1bw(v=vs.80).aspx

[Редактировать] Ренан правильно, конечно, когда он утверждает, что это будет работать только если объекты, содержащиеся в источнике данных имеют тип DateTime.См. Его ответ выше, а также для более подробной информации.

+0

Это будет работать, если данные в ячейке являются DateTime. Если это строка, которая по совпадению имеет этот текст, это приведет к появлению «22/11/2010 0:00:00». – Renan

+0

Вы правы. Я отредактировал свой ответ соответственно. Из-за названия вопросов я предполагал, что объекты действительно имеют тип DateTime. – Tobias

Смежные вопросы