Je dois trouver 2 implémentations complètes et élégantes de
public static DateTime AddBusinessDays(this DateTime date, int days)
{
// code here
}
and
public static int GetBusinessDays(this DateTime start, DateTime end)
{
// code here
}
O(1) préférable (pas de boucles).
EDIT : Par jours ouvrables, j'entends les jours de travail (lundi, mardi, mercredi, jeudi, vendredi). Pas de jours fériés, sauf les week-ends.
J'ai déjà des solutions peu élégantes qui semblent fonctionner, mais je me demande s'il existe des moyens élégants de le faire. Merci
Voici ce que j'ai écrit jusqu'à présent. Il fonctionne dans tous les cas et fait aussi les négatifs. J'ai toujours besoin d'une implémentation de GetBusinessDays
public static DateTime AddBusinessDays(this DateTime startDate,
int businessDays)
{
int direction = Math.Sign(businessDays);
if(direction == 1)
{
if(startDate.DayOfWeek == DayOfWeek.Saturday)
{
startDate = startDate.AddDays(2);
businessDays = businessDays - 1;
}
else if(startDate.DayOfWeek == DayOfWeek.Sunday)
{
startDate = startDate.AddDays(1);
businessDays = businessDays - 1;
}
}
else
{
if(startDate.DayOfWeek == DayOfWeek.Saturday)
{
startDate = startDate.AddDays(-1);
businessDays = businessDays + 1;
}
else if(startDate.DayOfWeek == DayOfWeek.Sunday)
{
startDate = startDate.AddDays(-2);
businessDays = businessDays + 1;
}
}
int initialDayOfWeek = (int)startDate.DayOfWeek;
int weeksBase = Math.Abs(businessDays / 5);
int addDays = Math.Abs(businessDays % 5);
if((direction == 1 && addDays + initialDayOfWeek > 5) ||
(direction == -1 && addDays >= initialDayOfWeek))
{
addDays += 2;
}
int totalDays = (weeksBase * 7) + addDays;
return startDate.AddDays(totalDays * direction);
}
14 votes
Existe-t-il des solutions élégantes lorsqu'il s'agit de quelque chose d'aussi illogique que les dates ?
0 votes
Êtes-vous préoccupé par les vacances ? - James Conigliaro . Non
0 votes
Avec l'internationalisation, c'est difficile. Comme mentionné dans d'autres fils de discussion ici sur le FOS, les jours fériés diffèrent certainement d'un pays à l'autre et même d'une province à l'autre. La plupart des gouvernements ne programment pas leurs vacances plus de cinq ans environ.
9 votes
Voter contre les gens qui essaient d'aider n'est pas une stratégie gagnante.
0 votes
La date, le début ou la fin peuvent-ils être des jours de week-end ?
0 votes
@Patrick Je suis sûr que c'est possible, mais surtout, quel est le résultat du calcul ? Par exemple, que représente le samedi + 0 jour ?
0 votes
Donc, si on ajoute un jour ouvrable au samedi, on obtient le lundi ou le mardi ? Et qu'en est-il de 0 jour ouvrable ?
0 votes
Je ne comprends pas pourquoi quelqu'un a déclassé Ash : il est vrai que ce n'est pas une réponse à la question posée, mais Ash a tout à fait raison, j'ai le même problème : mon logiciel doit fonctionner en Europe (lun-dim) ET en Afrique/Asie (sam-vendre). Pour décoter, il faut être un âne (l'animal, au cas où) qui ne voit pas plus loin que le bout de son nez : on dirait qu'il y a des gens sur SO qui ont peur de la connaissance, qui ne veulent tout simplement pas savoir et qui préfèrent rester dans leur ignorance rassurante : mais ils ne rendent pas service à AZ en premier lieu (et à eux-mêmes aussi, mais c'est leur propre affaire)
0 votes
Samedi + 1 devrait donner lundi. + 0 ne devrait rien changer, même si le samedi
0 votes
J'ai (le PO) rétrogradé parce que je pensais avoir été clair dans la question sur les contraintes et il semblait que Ash n'avait pas prêté attention. Je m'excuse si cela a blessé quelqu'un, mais c'est juste un downvote.
0 votes
@AZ : Où dans la question initiale avez-vous mentionné les contraintes d'internationalisation ?
0 votes
@AshMachine, exactement. Il ne l'a pas fait.
1 votes
Brève note sur le
AddBusinessDays
dans la question ci-dessus (qui était en fait une réponse supprimée que j'ai proposé d'annuler ; un mod a copié cette réponse dans la question à la place) : A mon avis, cette solution est meilleure que toutes les autres réponses jusqu'à présent car c'est la seule qui traite correctement les valeurs négatives, le samedi et le dimanche comme source et qui n'a pas besoin d'une librairie tierce (j'ai fait un petit programme pour tester les différentes solutions ici).if (businessDays == 0) return startDate;
au début de la méthode pour obtenir le résultat correct pour ce cas limite également.0 votes
@Slauma wow, c'était il y a 5 ans ! le temps passe vite quand on s'amuse je suppose. Merci pour le commentaire. C'est moi (le PO) qui ai posté cette réponse et elle a été supprimée parce qu'il n'était pas juste à l'époque de répondre à votre propre question. Il me manquait également une solution pour la deuxième méthode. La réponse acceptée actuellement fournissait des solutions décentes pour les deux (même si elles n'étaient pas parfaites) et je l'ai donc acceptée à un moment donné. Bien sûr, si quelqu'un a besoin d'une copie dans son propre projet, il doit d'abord la tester de manière exhaustive.
0 votes
En fait, j'ai tort. Il semble que quelqu'un d'autre ait fait la suppression et que ce soit récent :).
1 votes
@AZ. : La première suppression était assez ancienne. Après ma demande de suppression de votre réponse, un mod avait supprimé la réponse (pendant 30 secondes) pour copier le contenu sous votre question, puis il l'a supprimée à nouveau. C'est la raison pour laquelle votre réponse a ce récent horodatage de suppression. J'ai écrit le commentaire ci-dessus parce que, pour moi, votre réponse a été supprimée.
AddBusinessDays
était la solution la plus générale ici qui fonctionnait dans tous les cas dont j'ai besoin. Je l'ai copié dans un de mes projets actuels (après une légère modification et une traduction en C++), merci pour le code :) Il m'a beaucoup aidé car il est étonnamment difficile d'obtenir tous les cas limites.0 votes
Les jours fériés diffèrent d'un pays à l'autre, mais cette question n'a rien à voir avec les jours fériés. Elle concerne les week-ends, ce qui est clairement indiqué dans la description du problème. Cela aurait dû être un commentaire.