Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据日期范围生成工作日日期的算法_C++_Algorithm_Date - Fatal编程技术网

C++ 根据日期范围生成工作日日期的算法

C++ 根据日期范围生成工作日日期的算法,c++,algorithm,date,C++,Algorithm,Date,我希望能够计算两个日期d1和d2下周一至周五的工作日。然而,在一些地方,工作日是星期六、星期三或星期四 STL有没有一个设备,C++一般允许这样的计算?< /P> < P>不。营业日数据不是C++中可用的区域信息的一部分。您必须为所有感兴趣的地区建立一个“工作日”数据库。有很多日期处理功能,如调整到下一个工作日或前一个工作日、复活节假期、日本皇家日历、,计算两个日期之间的天数…关于工作日,区域设置甚至有点复杂,因为每个行业都有自己的bday版本。在我的行业金融服务中,债券交易日历不同于美国股票

我希望能够计算两个日期d1和d2下周一至周五的工作日。然而,在一些地方,工作日是星期六、星期三或星期四


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 )