Scribling Doodle Ответов: 1

Использование значения строки при проверке того, равно ли значение datetime сейчас


Привет,
Я создал этот фрагмент кода, чтобы проверить каждую ячейку в определенном столбце, а затем изменить цвет сетки в соответствии с некоторыми критериями, созданными в предложении If.
lblTime.Text = DateTime.Now.ToString();
foreach (DataGridViewRow row in dgw.Rows)
{
    var now = DateTime.Now;
    var cellDate = DateTime.Parse(row.Cells[5].Value.ToString());
    var forTenDays = now.AddDays(+10);

    if (now > cellDate)
    {
        //row.DefaultCellStyle.BackColor = Color.Red;
        row.Cells[5].Style.BackColor = Color.Red;
    }
    else if ((now < cellDate) && (cellDate < forTenDays))
    {
        row.Cells[5].Style.BackColor = Color.Yellow;
    }
    else
    {
        row.Cells[5].Style.BackColor = Color.YellowGreen;
    }
}


Но неожиданно я наткнулся на эту ошибку на этой линии:

var cellDate = DateTime.Parse(row.Cells[5].Value.ToString());


Ошибка:
Цитата:
Строка не была распознана как допустимая дата и время


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

Мне удалось заставить код работать примерно 1 месяц, ничего не меняя и не меняя фактического поведения, но теперь он внезапно перестал работать. Изменился с vs2017 на vs2013.
Я пробовал Date. ParseExact(); но тоже не сработало. дает-мне ту же ошибку.

F-ES Sitecore

Вам нужно использовать DateTime.TryParseExact и используйте формат даты, который есть в ячейке. В общем, никогда не оставляйте эти вещи предположениям, не используйте просто "ToString()" на датах и не используйте просто "Parse", поскольку нет глобальных форматов, код использует настройки на машине, чтобы получить формат, который делает этот код очень хрупким, как вы выясняете. Всегда работайте с определенными форматами, как при преобразовании в строки, так и при обратном разборе.

1 Ответов

Рейтинг:
1

RickZeeland

Хотя DateTime.Parse() довольно хорошо разбирается в различных форматах дат, см.: [dotnetperls] там все еще может быть недопустимое значение.
Поэтому я бы посоветовал обернуть ваш код в Try ... Catch, а также Тест на NULL ценности.
В месте улова лесозаготовка или MessageBox() заявление, чтобы вы знали, что происходит в случае ошибки:

try
{
    // your code here...
}
catch (Exception ex)
{
    MessageBox.Show("Error in DateTime.parse " + ex.Message);
}


Scribling Doodle

Это уже внутри предложения TryCatch. Он просто говорит: "строка не была распознана как допустимая Дата-Время"