вычисление разницы в месяцах между двумя датами - PullRequest
116 голосов
/ 06 октября 2009

В C # /. NET TimeSpan имеет TotalDays, TotalMinutes и т. Д., Но я не могу найти формулу для общей разницы месяцев. Меняются разные дни в месяце и високосные годы. Как я могу получить Всего месяцев ?

Редактировать Извините, что не совсем ясно: я знаю, что на самом деле не могу получить это от TimeSpan, но я подумал, что использование TotalDays и TotalMinutes будет хорошим примером для выражения того, искал ... кроме того, что я пытаюсь получить общее количество месяцев.

Пример: 25 декабря 2009 г. - 6 октября 2009 г. = 2 месяца. 6 октября по 5 ноября равняется 0 месяцам. 6 ноября 1 месяц. 6 декабря, 2 месяца

Ответы [ 24 ]

0 голосов
/ 06 октября 2009

http://www.astro.uu.nl/~strous/AA/en/reken/juliaansedag.html

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

0 голосов
/ 25 июля 2013
DateTime start = new DateTime(2003, 12, 25);
DateTime end = new DateTime(2009, 10, 6);
int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);
double daysInEndMonth = (end - end.AddMonths(1)).Days;
double months = compMonth + (start.Day - end.Day) / daysInEndMonth;
0 голосов
/ 04 июня 2011

Если вы имеете дело с месяцами и годами, вам нужно что-то, что знает, сколько дней у каждого месяца и какие годы являются високосными.

Введите григорианский календарь (и другие специфичные для культуры календарь реализации).

Хотя Calendar не предоставляет методы для прямого расчета разницы между двумя моментами времени, у него есть такие методы, как

DateTime AddWeeks(DateTime time, int weeks)
DateTime AddMonths(DateTime time, int months)
DateTime AddYears(DateTime time, int years)
0 голосов
/ 17 марта 2011

Нет встроенного способа сделать это точно в idiomatic-c #. Есть некоторые обходные пути, такие как этот пример CodeProject , которые были закодированы людьми.

...