2 février 2023
C#

C# Premier jour de la semaine

Pour mon composant Blazor Calendar, je suis tombé sur un petit problème pour déterminer le premier jour de la semaine. C’est alors pas nouveau et le web regorge de solutions qui au final.. et bien ne se basent que sur le samedi ou dimanche.. Sauf qu’il y a des pays comme l’Afghanistan, l’Iran et la Somalie où le premier jour de la semaine est le samedi .

Samedi ? Dimanche ? Lundi ? Vendredi !

En fait c’est pas si simple que ça car il faut noter que cela peut varier selon la culture et les traditions de chaque région. A moins d’aller dans chaque pays faire une enquête, le web me dit tout et son contraire. Si je regarde Wikipedia, on retrouve cette carte :

First Day of Week World Map

Et visiblement aux Maldives c’est un Vendredi

source : https://commons.wikimedia.org/wiki/File_talk:First_Day_of_Week_World_Map.svg

ChatGPT, Stack Overflow, à l’aide !

Bon, y’a pas de bonnes réponses qui me conviennent. Et le code suivant utisant simplement DateTime.FirstDayOfWeek, finalement me retourne le Dimanche.

<code>CultureInfo info = new CultureInfo("dz-DZ");
Console.WriteLine(info.DateTimeFormat.FirstDayOfWeek);</code>

Mon besoin est donc de lui donnée le jour du mois et qu’il me retourne le numéro du jour premier de la semaine. Auparavant j’aurai préciser dans mon code la Culture.

Je pars alors sur les numéros de jours comme DayOfWeek avec 0 pour dimanche, 1 pour lundi ainsi de suite.

<code>	/// &lt;summary>
	/// Returns the first day of the week for the day of a month.
	/// The order of the days of the week is different in each country
	/// DayOfWeek : 
	///   .Sunday    = 0
	///   .Monday    = 1
	///   .Tuesday   = 2
	///   .Wednesday = 3
	///   .Thursday  = 4
	///   .Friday    = 5
	///   .Saturday  = 6
	///
	/// => if Sunday is the First Day   =>   0  1  2  3  4  5  6
	/// => if Monday is the First Day   =>   1  2  3  4  5  6  0
	/// => if Saturday is the First Day =>   6  0  1  2  3  4  5
    ///
	/// To test : 
	/// CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("dz-DZ"); // firstDayOfWeek = Saturday
	/// CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("fr-FR"); // firstDayOfWeek = Monday
	/// CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); // firstDayOfWeek = Sunday
	/// &lt;/summary>
	/// &lt;param name="numOfDay">&lt;/param>
	/// &lt;returns>&lt;/returns>
	public static int GetNumOfDay(int numOfDay)
    {
        if (numOfDay &lt; 0) return 0;
        if (numOfDay > 6)
        {
            // Whatever the value I transform it in the place from 0 to 6
            numOfDay %= 7;
        }

        var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;

        if (firstDayOfWeek == DayOfWeek.Saturday)
        {
            if (numOfDay == 0) numOfDay = 6;
            if (numOfDay == 7) numOfDay = 0;
        }
        else if (firstDayOfWeek == DayOfWeek.Monday)
        {
            if (numOfDay >= 0) numOfDay++;
            if (numOfDay == 7) numOfDay = 0;
        }

        return numOfDay;
    }</code>

Et là tout va bien !

Tout va bien ? Bon ok, je n’ai pas gérer les Maldives. Si j’ai un maldivien comme utilisateur, j’ai donc une amélioration à faire

Laisser un commentaire