Поэтому я работаю над этим маленьким приложением, которое имеет функции для дат (показать разницу в днях, месяцах, годах и т.д.). Теперь делать такие вещи, как "Выбранная дата была 14151 дней, 465 месяцев и 39 лет назад", легко, но как можно Я могу сказать это в читаемом формате ("15 дней, 7 месяцев и 39 лет назад")?
Прямо сейчас, чтобы сделать это, у меня есть выбор, чтобы получить разницу в годах, например
int years = selectedDate.Year - currentDate.Year
то же самое в течение месяцев и дней. Однако это едва работает и идет не так, особенно когда вы идете на месяц вперед (когда он может сказать 15 дней и 1 месяц, потому что date1.Day - date2.Day = 15, в то время как это может быть, например, 8 дней. Я думаю, это из-за то, как даты работают с месяцами, но я не уверен.
Во всяком случае, я надеюсь, что у меня есть какой-то смысл, потому что я даже не могу себя отследить. Любые идеи очень ценятся. : D
С короткими периодами времени вы можете сделать это следующим образом:
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);
Вычитание одного DateTime
из другого возвращает TimeSpan
который вы можете использовать для определения периода времени между двумя датами, выраженного как измерение времени дней, часов, минут, секунд и т.д.
TimeSpan result = selectedDate - currentDate;
result.Days...
result.Hours...
etc.
Получение месяцев и лет сложнее, потому что дни в месяц меняются в год и т.д. Вам придется делать эту математику вручную, возможно, вне исходных объектов DateTime
.
Я делаю это, чтобы получить разницу между двумя датами в месяцах:
var start = startDate.Value;
var end = endDate.Value;
var duration = ((end.Year - start.Year) * 12) + end.Month - start.Month;
Конечно, единственная причина, по которой я получаю. Значение - это то, что они являются нулевыми датами, но я думаю, вы могли бы использовать что-то подобное в своей ситуации.
Вы можете выполнить математику с классом DateTime
. Результатом является TimeSpan
который ведет себя аналогично DateTime, просто представляя собой период времени, а не абсолютную дату.
DateTime selectedDate;
DateTime currentDate;
TimeSpan difference = selectedDate.Subtract(currentDate);
string result = difference.ToString("whatever format you like");
Используйте 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;
Если вы берете разницу между двумя объектами 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...
Year
- целое число, поэтомуint - int != TimeSpan
...