日期

简介:

日期和字符串一样,都不能改变自身的值

1  System.DateTime d  =  System.DateTime.Now;
2  System.Console.WriteLine(d.AddDays( 1 ));
3  System.Console.WriteLine(d.AddHours( 1 ));
4  System.Console.WriteLine(d.AddMilliseconds( 1 ));
5  System.Console.WriteLine(d.AddMinutes( 1 ));
6  System.Console.WriteLine(d.AddMonths( 1 ));
7  System.Console.WriteLine(d.AddYears( 1 ));
8  System.Console.WriteLine(d); // d没有改变值
9  d  =  d.AddYears( 1 ); // 需要重新赋值

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

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

ok,我们来看一个例子:
 

1  System.DateTime dt  =   new  System.DateTime( 1949 10 1 );
2  System.Console.WriteLine(dt.ToLongDateString());
3  System.DateTime d  =  System.DateTime.Now;
4   int  toDay  =  d.Day;
5   int  thisMonth  =  d.Month;
6  System.Console.WriteLine( " 当前日期:{0} " , d.Date);
7  d  =  d.AddDays( - (toDay  -   1 ));
8  System.Console.WriteLine( " 该月第一天:{0} " , d.Date);
9
10   do
11   {
12 string toDayFlag = "";
13 if (d.Day == toDay)
14 {
15 toDayFlag = "*";
16 }

17 System.Console.WriteLine("{0}:{1}{2}", d.Day, d.DayOfWeek, toDayFlag);
18 d = d.AddDays(1);
19 }

20   while  (d.Month  ==  thisMonth);

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

那么开始巩固知识:

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

1  System.DateTime dt  =  System.DateTime.Now;
2  dt  =  dt.AddDays( - (dt.DayOfYear  -   1 ));
3  System.Console.WriteLine( " 该年第一天:{0} " , dt.Date);
4  dt  =  dt.AddDays( 4 );
5   int  iDay  =   0 ;
6  System.Console.WriteLine( " 定位到第一个月的5号:{0} " , dt.Date);
7   do
8   {
9 if (dt.Month != 5 && dt.Month != 10)
10 {
11 if (dt.DayOfWeek == System.DayOfWeek.Saturday)
12 { iDay = -1; }
13 if (dt.DayOfWeek == System.DayOfWeek.Sunday)
14 { iDay = -2; }
15 }

16 else
17 { iDay = -5; }
18 System.Console.WriteLine("{0}月的发薪水日期是{1}",
19 dt.Month, dt.AddDays(iDay).Date);
20 dt = dt.AddMonths(1);
21 iDay = 0;
22 }

23   while  (dt.Year  ==  System.DateTime.Now.Year);


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

 

1   // 方案1
2  System.DateTime dt  =   new  System.DateTime( 1949 9 1 );
3  System.DateTime tmpdt;
4   do
5   {
6 if (dt.DayOfWeek == System.DayOfWeek.Monday)
7 { tmpdt = dt; }
8 else
9 {
10 if (dt.DayOfWeek == System.DayOfWeek.Sunday)
11 { tmpdt = dt.AddDays(1); }
12 else
13 { tmpdt = dt.AddDays(7 - (int)dt.DayOfWeek + 1); }
14 }

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

20   while  (dt.Year  <=  System.DateTime.Now.Year);
21
22
23   // 方案2
24  System.DateTime dt  =   new  System.DateTime( 1949 9 1 );
25  System.DateTime tmpdt;
26   do
27   {
28 if ((int)dt.DayOfWeek < 2)
29 { tmpdt = dt.AddDays(1 - (int)dt.DayOfWeek); }
30 else
31 {
32 tmpdt = dt.AddDays(7 - (int)dt.DayOfWeek + 1);
33 }

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

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

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


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

1  System.DateTime tmpdt  =   new  DateTime(year,  1 1 );
2   int  tmpMonth  =  tmpdt.Month; // 记录当前月
3   int [] weeks  =   new   int [ 12 ]; // 每个元素存放每月的星期数量
4   do
5   {
6 do
7 {//如果是周六就加1
8 if (tmpdt.DayOfWeek == System.DayOfWeek.Saturday)
9 {
10 weeks[tmpMonth - 1= weeks[tmpMonth - 1+ 1
11 }

12 tmpdt = tmpdt.AddDays(1);//下一天
13 }

14 while (tmpdt.Month == tmpMonth);//月循环
15 if (tmpdt.Day == 1 && tmpdt.DayOfWeek != System.DayOfWeek.Sunday)
16 {//如果每月的第一天不是周日,则上月再加一周
17 weeks[tmpMonth - 1= weeks[tmpMonth - 1+ 1;
18 }

19 tmpMonth = tmpdt.Month;
20 }

21   while  (tmpdt.Year  ==  year); // 年循环
22   for  ( int  i  =   0 ; i  <=  weeks.Length  -   1 ; i ++ )
23   {
24 System.Console.WriteLine("{0}年 {1}月有{2}周", year, i + 1, weeks[i]);
25 }

 


本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806905


相关文章
|
Web App开发 缓存 安全
尝试访问一个网站,但是这个访问失败了
尝试访问一个网站,但是这个访问失败了
250 0
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
351 91
|
10天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
848 156
|
3天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
255 156
|
4天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。