怎么计算两个DateTime变量之间相差多少个月阿 DateTime dt1 ,dt2;dt1.Month-dt2.Month 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TimeSpan ts=DateTime1-DateTime2;ts.TotalDays就是两个日期相差的天数,具体的月数就要计算了。 回复人: The123(在我地盤這 伱就得聽我的) ( ) 信誉:100 2004-09-09 12:20:00 得分: 0 DateTime dt1 ,dt2;dt1.Month-dt2.Month 2004年1月和2003年12月,相差几个月?-11吗? 最好的办法:(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month); triout(笨牛) 的方法非常正确(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month); 恩, triout(笨牛) 是对的我那个跨年就有问题了。 楼主也可以这样试试先比较dt1,dt2的大小假定dt1大。if((dt1.Year-dt2.Year)==0) dt1.Month-dt2.Monthelse dt1.Month-dt2.Month+(dt1.Year-dt2.Year)*12 感谢大家回答我的问题,不过这里我要求的是自然月(有多余的天一律舍去),也就是说也要考虑天的问题。(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)这样是没法用的但是一考虑天,就有(2-28)-(1-31)必须算一个月之类的麻烦了。简单地说,我想要达到d2=d1.AddMonth(i),则subMonth(d2,d1)=i的效果,大家帮忙想想看这个subMonth有什么实现的方法 没有很明白你的意思。我提供的方法已经可以解决了。中间可能存在的一个问题是:DateTime1的Day可能是31,而dateTime2的Day可能是1,这样,会少算一个月的。所以你在我给你的算法 的基础上进行进一步的判断就可以。 事实上:(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)对于DateTime1为2004年9月,DateTime2为2003年1月,得到的答案是20个月(1年加8个月)同样的,如果对DateTime1.AddMonth(20)后,得到的也是2004年9月。 所以,按照你的说法:回复人: yzxdc(yzxdc) ( ) 信誉:93 2004-09-09 12:52:00 得分: 0 感谢大家回答我的问题,不过这里我要求的是自然月(有多余的天一律舍去),也就是说也要考虑天的问题。(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)这样是没法用的但是一考虑天,就有(2-28)-(1-31)必须算一个月之类的麻烦了。简单地说,我想要达到d2=d1.AddMonth(i),则subMonth(d2,d1)=i的效果,大家帮忙想想看这个subMonth有什么实现的方法 不知道你是否有测试。当然,我给的算法还存在哪个日期大和小的问题,会出现负数。 /// <summary>/// same common params as the VBScript DateDiff: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctdatediff.asp/// /*Sample Code:/// * System.DateTime dt1 = new System.DateTime(1974,12,16);/// * System.DateTime dt2 = new System.DateTime(1973,12,16);/// * Page.Response.Write(Convert.ToString(DateDiff("t", dt1, dt2)));/// * *//// </summary>/// <param name="howtocompare"></param>/// <param name="startDate"></param>/// <param name="endDate"></param>/// <returns></returns>public static double DateDiff(string howtocompare, System.DateTime startDate, System.DateTime endDate) { double diff=0; try { System.TimeSpan TS = new System.TimeSpan(startDate.Ticks-endDate.Ticks); #region converstion options switch (howtocompare.ToLower()) { case "m": diff = Convert.ToDouble(TS.TotalMinutes); break; case "s": diff = Convert.ToDouble(TS.TotalSeconds); break; case "t": diff = Convert.ToDouble(TS.Ticks); break; case "mm": diff = Convert.ToDouble(TS.TotalMilliseconds); break; case "yyyy": diff = Convert.ToDouble(TS.TotalDays/365); break; case "q": diff = Convert.ToDouble((TS.TotalDays/365)/4); break; default: //d diff = Convert.ToDouble(TS.TotalDays); break; } #endregion } catch(Exception e) { diff = -1; Debug.WriteLine("Generic Exception Handler: {0}", e.Message.ToString()); throw; } return diff;} 说说我的看法,每个月的天数不一定,要实现“d2=d1.AddMonth(i),则subMonth(d2,d1)=i的效果”是不可能的,如,1月31日加一个月等于什么?所以微软的TimeSpan中并没有月数的计算方法。不过实际中有时要用到月数,如我做儿童能力测试软件中就是用月龄来计算的,用的方法是(y2 - y1)*12 + (m2 - m1) + (d2 - d1)/30 并进行四舍五入,得到月龄。不可能得到一个精确的月数,好在实际应用中也不要求太精确,找一个差不多的公式就行了。 triout(笨牛) 兄还是没看请我的前提啊,“多余的天一律舍去”,也就是说我想知道的时两个日期间的天数差折合成月是多少个月。 hhhh63兄说的对,看来没有什么现成的方法了,好像只能我自己写一个了。 既然你是要两个日期的天数差折合成多少个月,那么:如果你不考虑每个月的天数,就可以使用TimeSpan的方式:TimeSpan ts=DateTime1-DateTime2;int months=ts.TotalDays/30;如果你要考虑到其中每个月的天数,就使用:(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)有什么问题?或者,你会问:如果开始月头何结束月尾,该如何计算?这里只要你简单的判断:DateTime1的Day何DateTime2的Day就简单搞定的问题了,只要:DateTime1.Day-DateTime2.Day得到的数就可以判断,如果为0,上面的计算就刚好,否则就有差。问题一定要问清楚,然后自己多动脑筋。我想给你的答案已经非常的清楚明白的了,只在你自己根据需要如何运用的问题。已经告诉你1+1=2了,总不会再问1+2是多少吧/ 这个问题我在很前面的回复已经地提到了,老兄你非要我解释清楚吗简单地说就是要考虑月底的事,比如(1-31).AddMonth(1) = (2-28),所以(2-28)-(1-31)就必须等于1。但是2-28是不是月底取决于2月是不是闰月,也就是说,不是闰月的话(2-28)-(1-31)=1,是的话就是0了 不知道楼主的这个问题是一个实际问题还是理论研究。如果是实际问题的话比较好办,算出一个大概准确的值就行了,比如4.5个月算5个月,4.2个月算一个月。但我不太同意triout(笨牛)的算法(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)照这样 1月31号到2月1号 1月1号到2月28号都算一个月,不太妥,还是加上日子好点。如果是理论研究的话就属于历法的范筹了,现行的历法可能没有加一个月和减一个月的标准,当然楼主可以自己定义一些规则。“简单地说就是要考虑月底的事,比如(1-31).AddMonth(1) = (2-28),所以(2-28)-(1-31)就必须等于1。但是2-28是不是月底取决于2月是不是闰月,也就是说,不是闰月的话(2-28)-(1-31)=1,是的话就是0了”把其它的情况都列出来,再归纳一下,转换成代码就行了。不过这些规则还有一个大家认可的问题。 AddMonth(-1)可以取得上一个月 我知道用VBScript可以很容易解决这个问题,例如:You have been a member for <%=DATEDIFF(“d”,startdate,enddate)%> days,那个“d”表示的是返回天数,还可以用其他字符表示返回秒,分什么的,如:yyyy 年、q 季度、mm 月、y 天、d 天、w 天、ww 星期、h 小时、m 分钟、s 秒。 用showModialog弹出的页面 更新页面的值后,关闭 再打开还是原来的值? C# 怎么获取当前时间 紧急求助CSDN上的高手,都过来看看吧 拖动?? C#调试问题 急问一个线程池的问题,困惑很久了! 急求XDE for vs.net 2003 的教程 急 动态加载控件的窗体在最小化后再还原,控件多时有个肉眼可见的缓慢加载过程 很急的关于c#的问题,在线等解答 请问如何做?选择下拉框(内容为某数据库名字),然后在listbox里显示此数据库里面所有表的名字呢? 如何设置datagrid的超连接的url字段为多个?
DateTime dt1 ,dt2;
dt1.Month-dt2.Month
2004年1月和2003年12月,相差几个月?-11吗?
我那个跨年就有问题了。
先比较dt1,dt2的大小
假定dt1大。
if((dt1.Year-dt2.Year)==0)
dt1.Month-dt2.Month
else
dt1.Month-dt2.Month+(dt1.Year-dt2.Year)*12
(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)这样是没法用的
但是一考虑天,就有(2-28)-(1-31)必须算一个月之类的麻烦了。简单地说,我想要达到d2=d1.AddMonth(i),则subMonth(d2,d1)=i的效果,大家帮忙想想看这个subMonth有什么实现的方法
感谢大家回答我的问题,不过这里我要求的是自然月(有多余的天一律舍去),也就是说也要考虑天的问题。
(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)这样是没法用的
但是一考虑天,就有(2-28)-(1-31)必须算一个月之类的麻烦了。简单地说,我想要达到d2=d1.AddMonth(i),则subMonth(d2,d1)=i的效果,大家帮忙想想看这个subMonth有什么实现的方法
不知道你是否有测试。当然,我给的算法还存在哪个日期大和小的问题,会出现负数。
/// same common params as the VBScript DateDiff: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctdatediff.asp
/// /*Sample Code:
/// * System.DateTime dt1 = new System.DateTime(1974,12,16);
/// * System.DateTime dt2 = new System.DateTime(1973,12,16);
/// * Page.Response.Write(Convert.ToString(DateDiff("t", dt1, dt2)));
/// * */
/// </summary>
/// <param name="howtocompare"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public static double DateDiff(string howtocompare, System.DateTime startDate, System.DateTime endDate)
{
double diff=0;
try
{
System.TimeSpan TS = new System.TimeSpan(startDate.Ticks-endDate.Ticks);
#region converstion options
switch (howtocompare.ToLower())
{
case "m":
diff = Convert.ToDouble(TS.TotalMinutes);
break;
case "s":
diff = Convert.ToDouble(TS.TotalSeconds);
break;
case "t":
diff = Convert.ToDouble(TS.Ticks);
break;
case "mm":
diff = Convert.ToDouble(TS.TotalMilliseconds);
break;
case "yyyy":
diff = Convert.ToDouble(TS.TotalDays/365);
break;
case "q":
diff = Convert.ToDouble((TS.TotalDays/365)/4);
break;
default:
//d
diff = Convert.ToDouble(TS.TotalDays);
break;
}
#endregion
}
catch(Exception e)
{
diff = -1;
Debug.WriteLine("Generic Exception Handler: {0}", e.Message.ToString());
throw;
}
return diff;
}
(y2 - y1)*12 + (m2 - m1) + (d2 - d1)/30 并进行四舍五入,得到月龄。不可能得到一个精确的月数,好在实际应用中也不要求太精确,找一个差不多的公式就行了。
简单地说就是要考虑月底的事,比如(1-31).AddMonth(1) = (2-28),所以(2-28)-(1-31)就必须等于1。但是2-28是不是月底取决于2月是不是闰月,也就是说,不是闰月的话(2-28)-(1-31)=1,是的话就是0了
(DateTime1.Year-DateTime2.Year)*12+(DateTime1.Month-DateTime2.Month)
照这样 1月31号到2月1号 1月1号到2月28号都算一个月,不太妥,还是加上日子好点。如果是理论研究的话就属于历法的范筹了,现行的历法可能没有加一个月和减一个月的标准,当然楼主可以自己定义一些规则。
“简单地说就是要考虑月底的事,比如(1-31).AddMonth(1) = (2-28),所以(2-28)-(1-31)就必须等于1。但是2-28是不是月底取决于2月是不是闰月,也就是说,不是闰月的话(2-28)-(1-31)=1,是的话就是0了”
把其它的情况都列出来,再归纳一下,转换成代码就行了。不过这些规则还有一个大家认可的问题。
可以取得上一个月