日期

本文介绍了如何使用C#进行日期计算,包括获取指定日期的前后日期、月份第一天和最后一天等实用方法,并通过具体示例展示了工资发放日和开学日的确定逻辑。
日期和字符串一样,都不能改变自身的值
1None.gifSystem.DateTimed=System.DateTime.Now;
2None.gifSystem.Console.WriteLine(d.AddDays(1));
3None.gifSystem.Console.WriteLine(d.AddHours(1));
4None.gifSystem.Console.WriteLine(d.AddMilliseconds(1));
5None.gifSystem.Console.WriteLine(d.AddMinutes(1));
6None.gifSystem.Console.WriteLine(d.AddMonths(1));
7None.gifSystem.Console.WriteLine(d.AddYears(1));
8None.gifSystem.Console.WriteLine(d);//d没有改变值
9None.gifd=d.AddYears(1);//需要重新赋值

一些关于日期的算法要牢记

1None.gifSystem.Console.WriteLine(d.AddDays(-(d.Day-1)));//本月第一天
2None.gifSystem.Console.WriteLine(d.AddDays(-d.Day));//上月最后一天
3None.gifSystem.Console.WriteLine(d.AddDays(-(int)d.DayOfWeek));//本周第一天

ok,我们来看一个例子:

1None.gifSystem.DateTimedt=newSystem.DateTime(1949,10,1);
2None.gifSystem.Console.WriteLine(dt.ToLongDateString());
3None.gifSystem.DateTimed=System.DateTime.Now;
4None.gifinttoDay=d.Day;
5None.gifintthisMonth=d.Month;
6None.gifSystem.Console.WriteLine("当前日期:{0}",d.Date);
7None.gifd=d.AddDays(-(toDay-1));
8None.gifSystem.Console.WriteLine("该月第一天:{0}",d.Date);
9None.gif
10None.gifdo
11ExpandedBlockStart.gifContractedBlock.gifdot.gif{
12InBlock.gifstringtoDayFlag="";
13InBlock.gifif(d.Day==toDay)
14ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
15InBlock.giftoDayFlag="*";
16ExpandedSubBlockEnd.gif}

17InBlock.gifSystem.Console.WriteLine("{0}:{1}{2}",d.Day,d.DayOfWeek,toDayFlag);
18InBlock.gifd=d.AddDays(1);
19ExpandedBlockEnd.gif}

20None.gifwhile(d.Month==thisMonth);

上面例子输出本月的所有日期和星期,并在当日标注*

那么开始巩固知识:

设一企业合同约定每月5号发工资,请输出该企业今年实际每月发工资的日期(若5号是周六或周日,则工资提前到周五发)

1None.gifSystem.DateTimedt=System.DateTime.Now;
2None.gifdt=dt.AddDays(-(dt.DayOfYear-1));
3None.gifSystem.Console.WriteLine("该年第一天:{0}",dt.Date);
4None.gifdt=dt.AddDays(4);
5None.gifintiDay=0;
6None.gifSystem.Console.WriteLine("定位到第一个月的5号:{0}",dt.Date);
7None.gifdo
8ExpandedBlockStart.gifContractedBlock.gifdot.gif{
9InBlock.gifif(dt.Month!=5&&dt.Month!=10)
10ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
11InBlock.gifif(dt.DayOfWeek==System.DayOfWeek.Saturday)
12ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{iDay=-1;}
13InBlock.gifif(dt.DayOfWeek==System.DayOfWeek.Sunday)
14ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{iDay=-2;}
15ExpandedSubBlockEnd.gif}

16InBlock.gifelse
17ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{iDay=-5;}
18InBlock.gifSystem.Console.WriteLine("{0}月的发薪水日期是{1}",
19InBlock.gifdt.Month,dt.AddDays(iDay).Date);
20InBlock.gifdt=dt.AddMonths(1);
21InBlock.gifiDay=0;
22ExpandedBlockEnd.gif}

23None.gifwhile(dt.Year==System.DateTime.Now.Year);


设每年9.1开学,若9.1不是星期一,则要求开学日期改为9月的第一个星期一,请输出从1980-2004年的每年开学日期

1None.gif//方案1
2None.gifSystem.DateTimedt=newSystem.DateTime(1949,9,1);
3None.gifSystem.DateTimetmpdt;
4None.gifdo
5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
6InBlock.gifif(dt.DayOfWeek==System.DayOfWeek.Monday)
7ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{tmpdt=dt;}
8InBlock.gifelse
9ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
10InBlock.gifif(dt.DayOfWeek==System.DayOfWeek.Sunday)
11ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{tmpdt=dt.AddDays(1);}
12InBlock.gifelse
13ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{tmpdt=dt.AddDays(7-(int)dt.DayOfWeek+1);}
14ExpandedSubBlockEnd.gif}

15InBlock.gifSystem.Console.WriteLine("{0}年的9.1是{1}",dt.Year,dt.DayOfWeek);
16InBlock.gifSystem.Console.WriteLine("所以实际开学日期是:{0}",tmpdt.Date);
17InBlock.gifSystem.Console.WriteLine("------------------------");
18InBlock.gifdt=dt.AddYears(1);
19ExpandedBlockEnd.gif}

20None.gifwhile(dt.Year<=System.DateTime.Now.Year);
21None.gif
22None.gif
23None.gif//方案2
24None.gifSystem.DateTimedt=newSystem.DateTime(1949,9,1);
25None.gifSystem.DateTimetmpdt;
26None.gifdo
27ExpandedBlockStart.gifContractedBlock.gifdot.gif{
28InBlock.gifif((int)dt.DayOfWeek<2)
29ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{tmpdt=dt.AddDays(1-(int)dt.DayOfWeek);}
30InBlock.gifelse
31ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
32InBlock.giftmpdt=dt.AddDays(7-(int)dt.DayOfWeek+1);
33ExpandedSubBlockEnd.gif}

34InBlock.gifSystem.Console.WriteLine("{0}年的9.1是{1}",dt.Year,(int)dt.DayOfWeek);
35InBlock.gifSystem.Console.WriteLine("所以实际开学日期是:{0}",tmpdt.Date);
36InBlock.gifSystem.Console.WriteLine("------------------------");
37InBlock.gifdt=dt.AddYears(1);
38ExpandedBlockEnd.gif}

39None.gifwhile(dt.Year<=System.DateTime.Now.Year);

注意方案2的第29行,使用了01互换的方法,简化了周日和周一的计算


计算给定日期的年的每个月的周数

1None.gifSystem.DateTimetmpdt=newDateTime(year,1,1);
2None.gifinttmpMonth=tmpdt.Month;//记录当前月
3None.gifint[]weeks=newint[12];//每个元素存放每月的星期数量
4None.gifdo
5ExpandedBlockStart.gifContractedBlock.gifdot.gif{
6InBlock.gifdo
7ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{//如果是周六就加1
8InBlock.gifif(tmpdt.DayOfWeek==System.DayOfWeek.Saturday)
9ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
10InBlock.gifweeks[tmpMonth-1]=weeks[tmpMonth-1]+1;
11ExpandedSubBlockEnd.gif}

12InBlock.giftmpdt=tmpdt.AddDays(1);//下一天
13ExpandedSubBlockEnd.gif}

14InBlock.gifwhile(tmpdt.Month==tmpMonth);//月循环
15InBlock.gifif(tmpdt.Day==1&&tmpdt.DayOfWeek!=System.DayOfWeek.Sunday)
16ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{//如果每月的第一天不是周日,则上月再加一周
17InBlock.gifweeks[tmpMonth-1]=weeks[tmpMonth-1]+1;
18ExpandedSubBlockEnd.gif}

19InBlock.giftmpMonth=tmpdt.Month;
20ExpandedBlockEnd.gif}

21None.gifwhile(tmpdt.Year==year);//年循环
22None.giffor(inti=0;i<=weeks.Length-1;i++)
23ExpandedBlockStart.gifContractedBlock.gifdot.gif{
24InBlock.gifSystem.Console.WriteLine("{0}年{1}月有{2}周",year,i+1,weeks[i]);
25ExpandedBlockEnd.gif}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值