Есть ли способ сравнить даты "строки" на С# без преобразования строк?

155
15

У меня есть два поля:


string date1 = "04/26/10";
string date2 = "04/25/10";

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


if (date2 <= date1)
{
// perform some code here
}

Можно ли это сделать без предварительной конвертации полей в отдельную переменную типа даты?


EDIT: Я должен упомянуть, что эти значения поступают из таблицы базы данных, где значения даты начинаются с строкового формата. Старый код устаревшего...

спросил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
1
Решение
250

Нет, но нетрудно преобразовать дату в С#.

if ( DateTime.Parse(date2) <=  DateTime.Parse(date1))

{
// perform some code here
}

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
162

Если ваши даты фактически хранятся в виде строк в в базе данных, похоже, вы не можете быть уверены, что они будут в допустимом формате перед разбором. По этой причине я бы предложил небольшую вариацию ответа jle:

DateTime d1, d2;
if (DateTime.TryParse(date1, out d1) &&
DateTime.TryParse(date2, out d2) &&
d2 <= d1)
{
// perform some code here
}
else
{
// strings didn't parse, but hey,
//at least you didn't throw an exception!
}

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
97

По крайней мере вам нужно выделить строки, чтобы сравнить их в правильном порядке.


Если вы хотите оставить их в виде строк, вам необходимо изменить порядок их с помощью LARGEST- > SMALLEST, поэтому это:


yyyy/mm/dd

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


Сказав это, довольно легко преобразовать строки в DateTime, используя DateTime.ParseExact.

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
77

Как правило, это плохая идея сравнить дату как строки.


Но если ваши строки находятся в том же формате (например, yyyy/mm/dd означает годы, затем monthes then days), тогда сравнение может быть действительным.

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
62

Нет. Позвольте структуре .net создать это для вас. Он будет правильно определять настройки и формат даты пользователя (используя системные настройки, текущий поток) и определять, какой из них - месяц, год и день, особенно если эти данные поступают, например, из SQL-сервера.

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
62

Предпочтительно, чтобы перед форматированием была отформатирована дата. В зависимости от вашей культурыinfo самым безопасным способом сравнения дат является форматирование строки даты до "yyyy-mm-dd".


DateTime d1, d2;
string date1 = "04/26/10";
string date2 = "04/25/10";
d1 = DateTime.Parse(date1.ToString("yyyy-MM-dd"));
d2 = DateTime.Parse(date2.ToString("yyyy-MM-dd"));
if (d1 > d2)
{
//do something
}

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
62

Это можно было бы сделать с помощью манипуляции с строкой, но это сводилось бы к эффективному сравнению трех наборов целых чисел, которые в качестве строк могли бы вызвать дополнительные накладные расходы, чем преобразование в datetimes. Почему вы хотите это сделать?

ответил(а) 2021-01-19T21:18:46+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема