C#: как я вычитаю две даты?

Вот мой код:

DateTime date1 = new DateTime(byear, bmonth, bday, 0, 0, 0);
DateTime datenow =  DateTime.Now;
DateTime date2 = datenow - date1

На последней строке я получаю эту ошибку:

Ошибка 1 не Может неявно преобразовать тип 'Система. TimeSpan' к 'Системе. DateTime'

Как я вычитаю две даты?

7
задан Peter Mortensen 12 April 2010 в 22:06
поделиться

9 ответов

Дело в том, что, если подумать, вычитание одной даты из другой не должно давать дату, оно должно давать промежуток времени. И именно это происходит, когда вы используете DateTime.Subtract().

TimeSpan timeSpan = datenow - date1; //timespan between `datenow` and `date1`

Это заставит ваш текущий код работать.

С другой стороны, если вы хотите вычесть, скажем, один год из даты, вы можете использовать:

DateTime oneYearBefore = DateTime.Now.AddYears(-1); //that is, subtracts one year
19
ответ дан 6 December 2019 в 07:05
поделиться

Как уже упоминалось, date - date дает вам TimeSpan, а не DateTime. Если вы хотите DateTime, используйте AddDays (-1) как в:

DateTime subtractedDate = date1.AddDays(-1); 
3
ответ дан 6 December 2019 в 07:05
поделиться

Вы правильно вычитаете две даты в своем коде. Что происходит, так это то, что вы ожидаете, что разница между двумя датами будет другой датой, а это не так.

Как заметили другие плакаты, вы получаете TimeSpan . По вашим именам переменных я понимаю, что вы пытаетесь узнать чей-то возраст.

Возраст - это не дата, это продолжительность. Прочтите объект TimeSpan , и вы обнаружите, что он правильно выражает идею, которую вы ищете.

Мне не 0029-01-01, мне 29 лет. (Сегодня не мой день рождения, но предположим, что это для простых вычислений.)

Если вы пытаетесь показать чей-то возраст в элементе управления, и этот элемент управления требует DateTime , вы, вероятно, используете неправильный элемент управления сделать это.

1
ответ дан 6 December 2019 в 07:05
поделиться

Результатом сравнения дат является TimeSpan, а не значение DateTime.

Вы хотите сделать это:

TimeSpan result = datenow - date1;
1
ответ дан 6 December 2019 в 07:05
поделиться

Попробуйте использовать тики ...?

DateTime date1 = new DateTime(1986, 3, 16, 0, 0, 0);
DateTime datenow =  DateTime.Now;
DateTime date2 = new DateTime(datenow.Subtract(date1).Ticks);
1
ответ дан 6 December 2019 в 07:05
поделиться

.Subtract имеет две перегрузки. Один принимает DateTime и возвращает TimeSpan, другой принимает TimeSpan и возвращает DateTime.

Другими словами, если вы вычтете дату из даты, вы получите разницу во времени. В противном случае, если вы вычтите временной интервал из даты, вы получите новую дату.

1
ответ дан 6 December 2019 в 07:05
поделиться

Это не совсем ответ на ваш вопрос, но я предпочитаю использовать var вместо аннотирования переменных типами. var IMO заставляет код выглядеть намного чище, чем в противном случае.

Вот ваш фрагмент кода с vars:

var date1 = new DateTime(byear, bmonth, bday, 0, 0, 0);
var datenow = DateTime.Now;
var date2 = datenow - date1;

EDIT:

Для разработчиков C# с менталитетом var-is-bad:

[ Original Post Here ]

Я широко использую var. Была критика, что это снижает читабельность кода, но нет аргументов в поддержку этого утверждения.

Допустимо, это может означать, что не ясно, с каким типом мы имеем дело. Ну и что? В этом, собственно, и заключается смысл развязанной конструкции. Когда вы имеете дело с интерфейсами, вас совершенно не интересует тип переменной. var идет гораздо дальше, правда, но я думаю, что аргумент остается с точки зрения удобства чтения: Программист не должен интересоваться типом переменной а скорее в том, что делает переменная. Вот почему Microsoft также называет "утиной типизацией".

Итак, что делает переменная, когда я объявляю ее с помощью var? Легко, она делает все, что IntelliSense скажет мне делает. Любые рассуждения о C#, которые игнорируют IDE, не соответствуют реальности. На практике каждый код на C# программируется в IDE, которая поддерживает IntelliSense.

Если я использую объявленную переменную var и путаюсь, для чего эта переменная для чего она нужна, значит, что-то фундаментально неправильно в моем коде. не является причиной, она лишь делает симптомы видимыми. Не вините посланника.

Теперь команда разработчиков C# выпустила руководство, в котором говорится, что var следует использовать только использоваться только для захвата результата оператора LINQ, который создает анонимный тип (потому что здесь у нас нет реальной альтернативы var). Что ж, к черту. До тех пор, пока команда C# не предоставит мне разумных аргументов в пользу этого правила, я собираюсь игнорировать его, потому что по моему профессиональному и личному мнению, это чистый бред. (Извините; у меня нет ссылки на руководство, о котором идет речь.)

На самом деле, есть несколько (поверхностные) хорошие объяснения того. почему вы не должны использовать var, но я все еще считаю, что они в основном неверны. Возьмем пример с "удобством поиска": автор автор утверждает, что var затрудняет искать места, где используется MyType используется MyType. Верно. Так же как и интерфейсы. На самом деле, зачем мне знать где используется класс? Возможно, меня больше интересует, где он инстанцирован, и это все равно будет доступным для поиска, потому что где-то его конструктор должен быть вызван (даже если это делается косвенно, имя типа должно быть где-то упомянуто). - Konrad Rudolph

-2
ответ дан 6 December 2019 в 07:05
поделиться

Вы ожидаете, что разница двух дат будет датой, которой нет. При этом, если вам нужно вычесть определенное количество дней или месяцев, это можно легко сделать, используя встроенные методы объекта DateTime, такие как .AddDays (-1) , обратите внимание, что я использовал отрицательное число для вычитания, вы можете применить противоположное. Вот небольшой пример.

        DateTime now = DateTime.Now;

        // Get the date 7 days ago
        DateTime sevenDaysAgo = now.AddDays(-7);

        // Bulk: Get the date 7 days and two hours ago
        DateTime sevenDaysAndtwoHoursAgo = now.Add(-(new TimeSpan(7, 2, 0, 0)));
0
ответ дан 6 December 2019 в 07:05
поделиться

Не могли бы вы уточнить, что вы пытаетесь вычислить? Разница между двумя любыми датами в C# или реальной жизни - это промежуток времени. Если вы пытаетесь вычислить возраст, то вам нужен промежуток времени с момента рождения. Измените Date2 на

Timespan age = datenow - date1;
1
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: