柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 233, comments - 985, trackbacks - 17, articles - 29
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
由于项目的特殊需要,对于日期类System.DateTime小小的研究了一下,它的通用的,常用的方法就不说了,在MSDN更加详细的说明。

问题来源:实现一个查询,要查询系统当天的前1,前2,前1个月,前2个月,前3个月,前6个月的数据!

显然,当天的日期和时间可以用
System.DateTime.Now那么前几周,前几个月是哪年的几月几号怎么确定呢?
 查了System.DateTime有一个很好的方法

public DateTime Subtract(
   TimeSpan value );
这个可以得到当前日期的几天之前是哪年的几月几号!
So good!


那么前1周,前2周,就用7天前,14
天前就搞定了!
接下来月份怎么处理呢?一个月是多少天,是不确定的,与年有紧密关系,所以
Microsoft
想的非常周到,提供了一个优秀的方法,可以知道某年某月有多少天:
public static int DaysInMonth(
   int year,
   int month
);
那么现在只要确定一个月前是多少天以前就可以了!呵呵,思考了一下,写了个递归算法,基本上已经实现了需求!
欢迎大家提出更好的算法,或者方法、渠道!

/// <summary>
        
/// 得到某年某月的前几个月是多少天算法
        
/// </summary>
        
/// <param name="iYear">当前的年份</param>
        
/// <param name="iMonth">当前的月份</param>
        
/// <param name="iTimes">前n个月</param>

        private void GetMonthDay( int iYear, int iMonth, int iTimes)
        
{
            
// 条件非法,不需要计算
            if(iTimes <= 0)
                
return;

            
if(iMonth == 1)
            
{
                iMonth 
= 12;
                iYear 
= iYear - 1;
            }

            
else
            
{
                iMonth 
= iMonth - 1;
                iYear 
= iYear;
            }

            
if(iTimes == 1)
            
{                
                iPassDays 
+= System.DateTime.DaysInMonth(iYear,iMonth);
            }

            
else
            
{                
                iPassDays 
+= System.DateTime.DaysInMonth(iYear,iMonth);
                GetMonthDay(iYear,iMonth,iTimes
-1);                
            }
            
        }

Feedback

#1楼 [楼主]   回复  引用  查看    

2004-11-10 23:24 by 柚子Nan      
为什么代码贴出来是两份?

#2楼    回复  引用  查看    

2004-11-11 02:12 by geel      
没太看懂,为什么不直接用 AddMonths?

#3楼 [楼主]   回复  引用  查看    

2004-11-11 08:19 by 柚子Nan      
不是计算后边几个月是什么时候,所以不是AddMonths

我是要计算这个时间点之前的前3个月是什么时候!

#4楼    回复  引用  查看    

2004-11-11 08:31 by 小明      
冒昧问一下,好像iPassDays 没有定义,以及没有返回,调用这个函数后,如果知道到底有多少天,谢谢

#5楼 [楼主]   回复  引用  查看    

2004-11-11 08:33 by 柚子Nan      
在函数外边定一个int iPassDays ;
调用的时候,

GetMonthDay(2001,1,12);
this.lblDays.Text = iPassDays.ToString();

你可以看到2000年有366天!

#6楼    回复  引用  查看    

2004-11-11 08:36 by 无文件      
AddMonths里面的参数可以是负数呀,那样不就是前几个月了嘛

#7楼 [楼主]   回复  引用  查看    

2004-11-11 08:47 by 柚子Nan      
to 无文件 :

是的,呵呵,聪明!谢谢了!

#8楼 [楼主]   回复  引用  查看    

2004-11-11 08:56 by 柚子Nan      
在dudu的帮助下,现在贴代码变成一份了,需要在
工具——〉Internet选项——〉清除历史纪录,就不会发生了!
谢谢Dudu的帮忙!

#9楼    回复  引用  查看    

2004-11-11 09:02 by 小明      
不用递归啦,而且用以下函数即可得到:
返回的负值,表示以前多少天
正值,表示以后多少天
^_^

private int GetDaySpan(System.DateTime Current,int Months)
{
System.DateTime NewDate=Current.AddMonths(Months);
System.TimeSpan ts=NewDate.Subtract(Current);
return ts.Days;
}

private int GetDaySpan(int Year,int Month,int Months)
{
System.DateTime Current=new DateTime(Year,Month,1);
return GetDaySpan(Current,Months);
}

#10楼 [楼主]   回复  引用  查看    

2004-11-11 09:05 by 柚子Nan      
to 小明 :
呵呵,是啊,编程的时候就是忘记Current.AddMonths(Months)还可以传入负值,郁闷啊!

#11楼    回复  引用  查看    

2004-11-11 10:31 by 81      
晕!这种事也能忘。

#12楼    回复  引用  查看    

2004-11-11 11:56 by juqiang      
呵呵,确实晕!

#13楼    回复  引用  查看    

2004-11-11 23:15 by geel      
唉。。。。看来我还是看懂你的意思了,赫赫




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-11-11 08:54 编辑过
Google站内搜索

相关文章:

相关链接: