C++ 根据日期范围生成工作日日期的算法
我希望能够计算两个日期d1和d2下周一至周五的工作日。然而,在一些地方,工作日是星期六、星期三或星期四C++ 根据日期范围生成工作日日期的算法,c++,algorithm,date,C++,Algorithm,Date,我希望能够计算两个日期d1和d2下周一至周五的工作日。然而,在一些地方,工作日是星期六、星期三或星期四 STL有没有一个设备,C++一般允许这样的计算?< /P> < P>不。营业日数据不是C++中可用的区域信息的一部分。您必须为所有感兴趣的地区建立一个“工作日”数据库。有很多日期处理功能,如调整到下一个工作日或前一个工作日、复活节假期、日本皇家日历、,计算两个日期之间的天数…关于工作日,区域设置甚至有点复杂,因为每个行业都有自己的bday版本。在我的行业金融服务中,债券交易日历不同于美国股票
STL有没有一个设备,C++一般允许这样的计算?< /P> < P>不。营业日数据不是C++中可用的区域信息的一部分。您必须为所有感兴趣的地区建立一个“工作日”数据库。
有很多日期处理功能,如调整到下一个工作日或前一个工作日、复活节假期、日本皇家日历、,计算两个日期之间的天数…关于工作日,区域设置甚至有点复杂,因为每个行业都有自己的bday版本。在我的行业金融服务中,债券交易日历不同于美国股票交易日历,美国股票交易日历不同于亚洲商品日历 为了找出一个日期在一周中的哪一天,有一个boost date_time库,它可以帮助过滤掉一些明显的非工作日,但不考虑假期和其他奇怪的事情。这些将不得不以某种特定的方式保存 <>这是我如何在C++中做的,减去所有的错误检查< /P>typedef unsigned Date_t;//for this example, uints work fine
typedef std::vector<Date_t> datevec_t;//we need random access iterators
datevec_t dates;//one vector per locale
//add data in sorted order, one for each bday in the locale
dates.push_back(20090104);
dates.push_back(20090105);
dates.push_back(20090106);
dates.push_back(20090107);
查找20091225之前最后一个B日前的第三个B日
Date_t myday=*(std::lower_bound(dates.begin(),dates.end(),20091225)-3);
查找两个日历日期之间的工作日数
int numdays=std::upper_bound(dates.begin(),dates.end(),20100105)
-std::lower_bound(dates.begin(),dates.end(),20090105);
在SQL中,我做了如下工作:
create table BDays(
bday date,--the business day
daynum int,--sequential number
lcode int, --locale
primary (bday,ccode),
unique(daynum,ccode)
)
然后使用顺序daynums插入每个工作日的值
insert BDays values
(20090104,1,1),
(20090105,2,1),
(20090106,3,1),
-- etc for every business day in the locale
这实际上不是很多数据,只需要做一次。
执行存在性查询
select count(1) from BDays where bday=20090101 and lcode=1
计算日期,比如12月25日前最后一个工作日前的第三个B日是多少
select b1.bday from BDays b1
join BDays b2 on(b1.lcode=1 and b2.lcode=1 and b1.daynum-3=b2.daynum)
join (select max(bday) bday from BDays where bday<=20091225 and lcode=1) cday
on(cday.bday = b2.bday )
当地的假日使生活变得非常复杂。而且,在美国,如果你是一个游乐园,像阵亡将士纪念日这样的公共假日可能是一个工作日,即使对许多其他组织,如联邦和地方政府以及华尔街来说,这不是一个工作日。即使是在软件公司这样的组织中,阵亡将士纪念日也可能是技术支持的工作日,而不是销售和营销或研发的工作日。不要忘记,当地的节日也不仅仅取决于国家——例如,在马萨诸塞州,4月19日是当地的节日爱国者日,但该国其他地区却没有观察到这一点。
select b1.bday from BDays b1
join BDays b2 on(b1.lcode=1 and b2.lcode=1 and b1.daynum-3=b2.daynum)
join (select max(bday) bday from BDays where bday<=20091225 and lcode=1) cday
on(cday.bday = b2.bday )