关于C#:两个整数日期之间的月份

Months between two integer dates

本问题已经有最佳答案,请猛点这里访问。

我有两个日期作为整数。我怎样才能在c中找到这两个整数之间的月份差?

例如:

1
2
Int32 beginDate= 20130307(yyyymmdd)
Int32 beginDate= 20140507(yyyymmdd)

我需要14个月的结果。

我已经试过了:

1
2
3
4
DateTime beginDatepar = Convert.ToDateTime(beginDate);
DateTime endDatepar = Convert.ToDateTime(beginDate);
int monthDifference = ((beginDatepar.Year - endDatepar.Year) * 12) +
                        beginDatepar.Month - endDatepar.Month;

但当我将int32转换为datetime时,错误是"从"int32"到"datetime"的转换无效"。


你可以用我的Noda时间库。它是专门为使这样的事情更简单而创建的。

1
2
3
4
5
6
7
8
9
10
// TODO: Encapsulate this conversion in a separate method
LocalDate start = new LocalDate(beginDate / 10000,
                                (beginDate / 100) % 100,
                                beginDate % 100);
LocalDate end = new LocalDate(endDate / 10000,
                              (endDate / 100) % 100,
                              endDate % 100);

Period period = Period.Between(start, end, PeriodUnits.Months);
int months = period.Months;

请注意,这将返回完整的月份-因此,如果将months添加到start,您将得到一个早于或等于end的值,但如果添加months + 1,则严格在end之后。

例如,5月20日到7月10日是一个月,而不是两个月。

作为一个单独的问题,我强烈建议您首先停止将日期表示为这样的整数。追溯到代码第一次这样做的地方,并修复它。


如果不需要小数部分,请尝试如下操作:

1
2
3
4
5
6
int beginDate = 20130307;
int endDate = 20140507;

int diff = ((endDate - beginDate)  / 100);

int diff_month = (diff / 100) * 12 + diff % 100;


1
2
3
4
5
6
7
8
9
    Int32 beginDate = 20130307;
    Int32 endDate = 20140507;
    Int32 year1 = beginDate / 10000;
    Int32 year2 = endDate / 10000;

    Int32 month1 = (beginDate % 10000) / 100;
    Int32 month2 = (endDate % 10000) / 100;

    Int32 MonthDiff = (12 * year1 + month1) - (12 * year2 + month2);