C# 以月为单位计算日期差异

C# 以月为单位计算日期差异,c#,.net,C#,.net,我有一个返回年和月值的字段。例如,20119年(2011年为年份,9年为9月)。如何将其与当前年度和月份进行比较,以获得月份差异?例如,在相同的格式中,当前年份和月份将是20135,因此我要查找的值将是20。20135减去20个月就是20119。可能不知道如何构造公式来使用日期函数动态计算月差。为什么不将每个日期字段的年数乘以一年中的月数,然后返回差值?试试这个方法 DateTime x1 = DateTime.ParseExact("20119", "yyyyM", CultureInfo.I

我有一个返回年和月值的字段。例如,20119年(2011年为年份,9年为9月)。如何将其与当前年度和月份进行比较,以获得月份差异?例如,在相同的格式中,当前年份和月份将是20135,因此我要查找的值将是20。20135减去20个月就是20119。可能不知道如何构造公式来使用日期函数动态计算月差。

为什么不将每个日期字段的年数乘以一年中的月数,然后返回差值?

试试这个方法

DateTime x1 = DateTime.ParseExact("20119", "yyyyM", CultureInfo.InvariantCulture);
DateTime x2 = DateTime.ParseExact("20135", "yyyyM", CultureInfo.InvariantCulture);

int months =  Math.Abs((x2.Month - x1.Month) + 12 * (x2.Year - x1.Year));

这是MSDN()上发布的解决方案的代码片段:

也应工作数年/数月(如下所示):

希望这会有所帮助。
Rgds,AB

您基本上可以拆分字符串

int a = 201410;
int b= 20139;

int year1 = int.Parse(a.ToString().Substring(0,4));
int year2 = int.Parse(b.ToString().Substring(0,4));

int month1 = int.Parse(a.ToString().Substring(4));
int month2 = int.Parse(b.ToString().Substring(4));

//now construct a date for each
DateTime date1 = new DateTime(year1, month1, 1);
DateTime date2 = new DateTime(year2, month2, 1);

//then subtract them and make it months
int numberOfMonths = ((date1.Year - date2.Year) * 12) + date1.Month - date2.Month;

首先,根据你的问题,我假设:

  • 单一日期月份将有一位数字
  • 年+月的值是一个字符串(如果是int,则在下面代码中的in值上抛出一个ToString()
因此,您的值的长度将为5-6位。您可以用更少的行来执行下面的代码,但请原谅我冗长的回答-我将添加额外的代码以使其更清楚:

通过获取使用日期,我们只能将当前日期作为月份年。现在

// Just want the month/year
DateTime currentDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
现在,我们可以使用一个子字符串方法(记住我的假设,我们正在处理一个字符串值,如果不是的话,则转换为字符串())获取您的日期,以针对当前的年/月进行测试

现在让我们来看看区别:

// get month dif - remove abs() if want negative if test date in future
int numberOfMonths = Math.Abs(((currentDate.Year - testDate.Year) * 12) + 
  (currentDate.Month - testDate.Month));

现在-如果您想比较yyyym格式的2天,而不是使用当前日期,只需执行上面列出的年/月转换,然后在此基础上执行月dif公式。

您可以使用中的类DateDiff来计算月份:

// ----------------------------------------------------------------------
public void CalcMonths( DateTime epoch )
{
  DateDiff dateDiff = new DateDiff( DateTime.Now, epoch );
  Console.WriteLine( "{0} months", dateDiff.Months );
  // > 1 Year 4 Months 12 Days 12 Hours ago
} // CalcMonths

到目前为止你试过什么?如果你还没有尝试过任何东西,那就看看DateTime对象的方法吧。我认为你不能直接从一个timespan@Greg:谢谢你的评论。我已经为这个特殊情况添加了一个关于TimeSpan对象用法的说明。不确定我是否理解你的意思。你是说:date1=20139和date2=20138(相差一个月)。2013*9-2013*8=2013。(2013*12+9)-(2013*12+8)啊——这更有意义。非常聪明。格式应该是“yyyyM”而不是“yyyyM”(月而不是分钟)?当我尝试它时,它给了我x1=01/01/2011 12:09:00AM@Greg,是的,应该是MThanks rs。有没有简单的方法将当前日期转换为“20135”格式?不要将当前日期的年份部分与当前日期的月份部分连接起来。@obautista,试试-
DateTime.Now.ToString(“yyyyM”)
    // breaking out test date to year/month portions and saving as a new date time
    string testDateValue = "20119";
    int testDateYear = Convert.ToInt32(testDateValue.Substring(0, 4));
    int testDateMonth = Convert.ToInt32(testDateValue.Substring(4));
    DateTime testDate = new DateTime(testDateYear, testDateMonth, 1);
// get month dif - remove abs() if want negative if test date in future
int numberOfMonths = Math.Abs(((currentDate.Year - testDate.Year) * 12) + 
  (currentDate.Month - testDate.Month));
// ----------------------------------------------------------------------
public void CalcMonths( DateTime epoch )
{
  DateDiff dateDiff = new DateDiff( DateTime.Now, epoch );
  Console.WriteLine( "{0} months", dateDiff.Months );
  // > 1 Year 4 Months 12 Days 12 Hours ago
} // CalcMonths