J'ai mis du temps à trouver une solution... J'ai créé une table DB que je tire dans un tableau avec mes jours de vacances. Tous les crédits à Kev (sur ce post) .. J'ai dû modifier le sien pour qu'il fonctionne tel quel pour moi.
Dans mon cas, si le premier jour était un samedi, et que mon workingDayCount = -1, je veux repasser le jeudi (car ma date ne peut pas tomber un week-end ou un jour férié... il faut que ce soit un jour ouvrable... dans ce cas le vendredi).
Le code de Kev pourrait renvoyer un dimanche ... le code ci-dessous le ramènera au jour ouvrable précédent (généralement un vendredi - sauf si le vendredi est un jour férié, auquel cas il renverrait au jeudi).
public static DateTime AddWorkDays(this DateTime date, int workingDays, params Holidays[] bankHolidays)
{
int direction = workingDays < 0 ? -1 : 1;
DateTime newDate = date;
// If a working day count of Zero is passed, return the date passed
if (workingDays == 0)
{
newDate = date;
}
else
{
while (workingDays != -direction)
{
if (newDate.DayOfWeek != DayOfWeek.Saturday &&
newDate.DayOfWeek != DayOfWeek.Sunday &&
Array.IndexOf(bankHolidays, newDate) < 0)
{
workingDays -= direction;
}
// if the original return date falls on a weekend or holiday, this will take it to the previous / next workday, but the "if" statement keeps it from going a day too far.
if (workingDays != -direction)
{ newDate = newDate.AddDays(direction); }
}
}
return newDate;
}
Voici ma classe de vacances simple :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Clarity.Utilities
{
public class Holidays
{
public int Id { get; set; }
public DateTime dtHoliday { get; set; }
public string Desc { get; set; }
public bool Active { get; set; }
}
}
Voici comment remplir le tableau :
private Holidays[] PopulateArrayWithDates()
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
DateTime[] dtHolidays = new DateTime[] { };
string sql = @"SELECT HolDate, HolName FROM [Server].DBName.dbo.tblHolidays";
SqlCommand ADDCmd = new SqlCommand(sql, con);
DataTable table = new DataTable();
DataTable tbl = new DataTable();
Utilities.Holidays[] allRecords = null;
using (var command = new SqlCommand(sql, con))
{
con.Open();
using (var reader = command.ExecuteReader())
{
var list = new List<Holidays>();
while (reader.Read())
list.Add(new Holidays { dtHoliday = reader.GetDateTime(0), Desc = reader.GetString(1) });
allRecords = list.ToArray();
}
}
return allRecords;
}
3 votes
Comment savoir quels jours sont des jours fériés ?
0 votes
Vous pouvez étendre la méthode indiquée par @Taz pour inclure les vacances.