CTimeSpan::GetDays()一个需要注意的地方

本文探讨了在不同时间区使用CTime和CTimeSpan类进行时间差计算时遇到的问题,特别是在涉及夏令时(DST)的情况下,计算得出的天数可能会有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在编程的过程中要经常使用CTime和CTimeSpan类,尤其是利用CTimeSpan来求时间差。如:

CTime tmBegin(1996,2,28,0,0,0);

CTime tmEnd(1996,3,11,0,0,0);

CTimeSpan tmSpan = tmEnd - tmBegin;

int nDays = tmSpan.GetDays();

int nHours= tmSpan.GetHours();

 

如果你的系统时间时区是北京时间,那么nDays = 12, nHours = 0;

如果你的系统时间时区是纽约时间,那么nDays = 11, nHours = 23.

 

CTime tmBegin(1996,10,31,0,0,0);

CTime tmEnd(1996,11,4,0,0,0);

CTimeSpan tmSpan = tmEnd - tmBegin;

int nDays = tmSpan.GetDays();

int nHours= tmSpan.GetHours();

 

如果你的系统时间时区是北京时间,那么nDays = 4, nHours=0;

如果你的系统时间时区是纽约时间,那么nDays = 4, nHours=1.

 

原因是DST(daylight saving time),由于世界上的大部分国家都使用了夏令时(中国除外),因此结果可能会出现差异。

 

美国和加拿大原本于每年10月的最后一个星期日凌晨2时起实施冬令时间;4月的第一个星期日凌晨2时起,恢复夏令时间。
但是根据美国国会最新通过的能源法案,为加强日光节约,自2007年起延长夏令时间,开始日期从每年4月的第一个星期日,提前到3月的第二个星期日,结束日期从每年10月的最后一个星期日,延后到11月的第一个星期日。

 

因此,对于第一个例子,

如果时区是纽约时间的话,tmSpan.GetDays()=11,tmSpan.GetHours()=23,tmSpan.GetMinutes()=0;

如果时区是北京时间的话,tmSpan.GetDays()=12,tmSpan.GetHours()=0,tmSpan.GetMinutes()=0;

 

其实在msdn上面已经有了明确的解释:

Remarks

Note that Daylight Savings Time can cause GetDays to return a potentially surprising result. For example, when DST is in effect, GetDays reports the number of days between April 1 and May 1 as 29, not 30, because one day in April is shortened by an hour and therefore does not count as a complete day.

 

可是,今天我却为了这个问题整整花费了一天的时间来找bug!!基础!基础!打基础!

谨以此文作为自己的教训!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值