2010-04-18 10 views

Répondre

5

Non. Les données de jour ouvré ne font pas partie des informations de locale disponibles en C++. Vous aurez à construire une base de données de ce qui compte exactement comme un «jour ouvrable» pour tous les lieux d'intérêt.

+5

Et les fêtes locales compliquent énormément la vie.Et, aux États-Unis, un jour férié comme Memorial Day peut être un jour ouvrable (si vous êtes un parc d'attractions, par exemple) même si pour de nombreuses autres organisations (par exemple, le gouvernement fédéral et local - et Wall Street), ce n'est pas un jour ouvrable. Même au sein d'une organisation comme une société de logiciels, Memorial Day peut être un jour ouvrable pour Tech Support, mais pas pour les ventes et le marketing, ou la R & D. –

+3

N'oubliez pas que les fêtes locales ne dépendent pas uniquement de la campagne - au Massachusetts, par exemple, il y a un jour férié local "Patriots" le 19 avril, mais le reste du pays ne l'observe pas. – bdonlan

1

Quantlib a beaucoup de fonctions de gestion des dates, comme l'ajustement au prochain jour ouvrable ou les précédents, les vacances de Pâques, calendrier impérial japonais, en comptant le nombre de jours entre deux dates ...

2

Les paramètres régionaux est même un peu plus compliqué concernant les jours ouvrables, puisque chaque industrie a sa propre version de ce qu'est un bday. Dans mon secteur (services financiers), le calendrier d'échange des obligations est différent du calendrier d'échange des actions américaines, qui est différent du calendrier des matières premières asiatiques. Pour connaître le jour de la semaine, il existe une bibliothèque boost date_time, http://www.boost.org/doc/libs/1_42_0/doc/html/date_time.html qui permet de filtrer certains des jours non commerciaux évidents, mais ne tient pas compte des jours fériés et autres bizarreries. Ceux-ci devront simplement être conservés de manière ad hoc.

Voilà comment je le fais en C++ (moins tous les contrôles d'erreur)

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); 

Le calcul des dates se fait soit à l'aide d'une bibliothèque grégorienne régulière ainsi que mes holdiays spéciales et d'autres données de fermetures. Mais en pratique, je ne calcule pas les dates à chaque fois, mais charge les résultats calculés à partir d'un magasin de données, car il ne change pratiquement jamais et est généralement connu au moins un an à l'avance. (Dans mon cas, je le fais dans certains langauage de script, et lire les résultats d'une base de données SQL)

Maintenant, pour faire une requête existence

bool is_bday=std::binary_search(dates.begin(),dates.end(),20091225); 

Pour la 3ème bday proir au dernier bday avant 20091225

Date_t myday=*(std::lower_bound(dates.begin(),dates.end(),20091225)-3); 

Pour trouver le nombre de jours ouvrables entre deux dates du calendrier

int numdays=std::upper_bound(dates.begin(),dates.end(),20100105) 
      -std::lower_bound(dates.begin(),dates.end(),20090105); 

Dans SQL je l'ai fait quelque chose comme:

create table BDays(
    bday date,--the business day 
    daynum int,--sequential number 
    lcode int, --locale 
    primary (bday,ccode), 
    unique(daynum,ccode) 
    ) 

ensuite insérer des valeurs pour chaque jour ouvrable, en utilisant daynums séquentielle

insert BDays values 
    (20090104,1,1), 
    (20090105,2,1), 
    (20090106,3,1), 
-- etc for every business day in the locale 

Ceci est en fait pas beaucoup de données, et ne doit être fait une fois . Pour faire une requête existence

select count(1) from BDays where bday=20090101 and lcode=1 

Pour faire des maths date, comme ce qui est le troisième bday avant le dernier jour ouvrable avant le 25 décembre?

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) 
Questions connexes