Reden Rodriguez Ответов: 2

Как преобразовать значение datagridview в значение datetime?


hello can anyone help me here
i got this code

DateTime d1;
            DateTime d2;
            for(int i=0;i<dataGridView1.RowCount-1;i++)
            {
                d1 = Convert.ToDateTime(dataGridView1.Rows[i].Cells[2].Value);
                d2 = Convert.ToDateTime(dataGridView1.Rows[i].Cells[1].Value);
                TimeSpan ts = d1 - d2;
                dataGridView1.Rows[i].Cells[3].Value = ts.Days;
            }

but it seems that i'm doing it wrong
the error says 'String was not recognized as a valid DateTime'.
and i also had this code to be appeared in my datagridview

dataGridView1.ColumnCount = 4;
            dataGridView1.Columns[0].Name = "Book";
            dataGridView1.Columns[1].Name = "Borrowed date";
            dataGridView1.Columns[2].Name = "Delivered date";
            dataGridView1.Columns[3].Name = "Time Span";

            dataGridView1.Rows.Add("Book 1", "13.01.2018", "20.01.2018");
            dataGridView1.Rows.Add("Book 2", "05.03.2018", "13.03.2018");
            dataGridView1.Rows.Add("Book 3", "20.04.2018", "15.05.2018");


Что я уже пробовал:

i tried to look in stack overflow but i just get the same converting method

2 Ответов

Рейтинг:
15

BillWoodruff

string format = "dd.MM.yyyy";
CultureInfo provider = CultureInfo.InvariantCulture;

string s1 = "13.01.2018";

DateTime dtm = DateTime.ParseExact(s1, format, provider);
Я бы посоветовал вам перехватывать ошибки, используя это:
string format = "dd.MM.yyyy";
CultureInfo provider = CultureInfo.InvariantCulture;

string s1 = "13.01.2018";

DateTime auDate;

if (DateTime.TryParseExact(s1, format, provider, DateTimeStyles.None, out auDate))
{
    // 'auDate has valid DateTime
}
else
{
    throw new InvalidDataException("error parsing Datetime");
}


Maciej Los

5ed!

BillWoodruff

спасибо, Мацей !

Рейтинг:
10

Maciej Los

Альтернативно к решению №1 путем Биллвудрафф[^], вы можете использовать значение datetime.Метод ParseExact (System) | Microsoft Docs[^] для преобразования строки в правильное значение DateTime.

string sdate = "13.08.2018";	
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("DE-de");
string format = "dd.MM.yyyy";

DateTime d = DateTime.ParseExact(sdate, format, ci);
Console.WriteLine($"{d}");


Вот способ преобразования строковых дат в правильные даты с помощью запроса Linq:

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("DE-de");
string format = "dd.MM.yyyy";
dt = dataGridView1.Rows.Cast<DataGridViewRow>()
    .Where(x =>x.Cells[0].Value!=null)
    .Select(x => dt.LoadDataRow(new object[]
            {
                x.Cells[0].Value,
                DateTime.ParseExact(x.Cells[1].Value.ToString(), format, ci),
                DateTime.ParseExact(x.Cells[2].Value.ToString(), format, ci),
                (DateTime.ParseExact(x.Cells[2].Value.ToString(), format, ci) - DateTime.ParseExact(x.Cells[1].Value.ToString(), format, ci)).Days
            }, false))
    .CopyToDataTable();

dataGridView1.Columns.Clear();
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = dt;