C # Получить разницу между двумя датами DateTime [дубликаты]

1

Поэтому я работаю над этим маленьким приложением, которое имеет функции для дат (показать разницу в днях, месяцах, годах и т.д.). Теперь делать такие вещи, как "Выбранная дата была 14151 дней, 465 месяцев и 39 лет назад", легко, но как можно Я могу сказать это в читаемом формате ("15 дней, 7 месяцев и 39 лет назад")?

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

int years = selectedDate.Year - currentDate.Year

то же самое в течение месяцев и дней. Однако это едва работает и идет не так, особенно когда вы идете на месяц вперед (когда он может сказать 15 дней и 1 месяц, потому что date1.Day - date2.Day = 15, в то время как это может быть, например, 8 дней. Я думаю, это из-за то, как даты работают с месяцами, но я не уверен.

Во всяком случае, я надеюсь, что у меня есть какой-то смысл, потому что я даже не могу себя отследить. Любые идеи очень ценятся. : D

Теги:
datetime
date
visual-studio-2010

6 ответов

2
Лучший ответ

С короткими периодами времени вы можете сделать это следующим образом:

        TimeSpan timeDiff = selectedDate - currentDate;
        string readableDiff = string.Format(
            "{0:D2} hrs, {1:D2} mins, {2:D2} secs",
            timeDiff.Hours, timeDiff.Minutes, timeDiff.Seconds);

Но я заметил, что вы имеете дело с более длительными периодами, охватывающими годы и месяцы. Для таких расчетов вам нужно что-то более мощное, чем TimeSpan. Вы можете проверить порт Jon Skeet Noda Time для платформы.NET: https://code.google.com/p/noda-time/

С Noda Time вы можете сделать что-то вроде этого:

        var period = Period.Between(selectedDate, currentDate,
            PeriodUnits.Years | PeriodUnits.Months | PeriodUnits.Days);
        string readableDifference = string.Format(
            "{0} years, {1} months and {2} days",
            period.Years, period.Months, period.Days);
  • 0
    Year - целое число, поэтому int - int != TimeSpan ...
  • 1
    Дэвид, спасибо за указание на это, исправил это сейчас.
5

Вычитание одного DateTime из другого возвращает TimeSpan который вы можете использовать для определения периода времени между двумя датами, выраженного как измерение времени дней, часов, минут, секунд и т.д.

TimeSpan result = selectedDate - currentDate;
result.Days...
result.Hours...
etc.

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

0

Я делаю это, чтобы получить разницу между двумя датами в месяцах:

var start = startDate.Value;
var end = endDate.Value;

var duration = ((end.Year - start.Year) * 12) + end.Month - start.Month;

Конечно, единственная причина, по которой я получаю. Значение - это то, что они являются нулевыми датами, но я думаю, вы могли бы использовать что-то подобное в своей ситуации.

0

Вы можете выполнить математику с классом DateTime. Результатом является TimeSpan который ведет себя аналогично DateTime, просто представляя собой период времени, а не абсолютную дату.

DateTime selectedDate;
DateTime currentDate;

TimeSpan difference = selectedDate.Subtract(currentDate);

string result = difference.ToString("whatever format you like");
0

Используйте TimeSpan и Math.Abs для учета отрицательных значений:

DateTime date1 = new DateTime(2012, 5, 15);
DateTime date2 = new DateTime(2014, 5, 16);

TimeSpan dateDiff = date1 - date2;

int years = Math.Abs((int)dateDiff.TotalDays) / 365;
0

Если вы берете разницу между двумя объектами DateTime, вы получаете объект TimeSpan.

DateTime a = DateTime.Now;
DateTime b = DateTime.Now.AddYears(-1);
TimeSpan c = a - b;
Console.WriteLine( c );

364.23:59:59.9951930 ответ 364.23:59:59.9951930. Вы можете либо перегрузить toString() для отформатированного ответа, либо получить c.TotalMilliseconds и делить/модули по мере необходимости, чтобы узнать, сколько лет/месяцев /etc...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню