Finding weekend days based on culture

后端 未结 5 715
礼貌的吻别
礼貌的吻别 2020-12-19 02:34

Is there a way to find the days that constitute a weekend or workweek based on different cultures using the .NET framework? For example, some Muslim countries have a workwee

5条回答
  •  离开以前
    2020-12-19 03:20

    No one had a solution for this so I wrote one. This uses the country to determine if a day is a workday, weekend, or 1/2 workday (Saturday in some countries). There is some ambiguity in this as in Mexico a 1/2 day on Saturday is "customary" but not official. For cases like this, I set it as work time.

    This covers everything except 3 provinces in Malaysia, which are different from the rest of Malaysia. AFAIK, CultureInfo.Name does not have a distinct value for those 3 provinces. Most interesting country, Brunei where the weekend is Friday & Sunday, with Saturday a workday.

    Code is downloadable as a project at Is it the weekend? Main code below:

    using System;
    using System.Globalization;
    
    namespace windward
    {
        /// 
        /// Extensions for the CultureInfo class.
        /// 
        public static class CultureInfoExtensions
        {
            /// 
            /// The weekday/weekend state for a given day.
            /// 
            public enum WeekdayState
            {
                /// 
                /// A work day.
                /// 
                Workday,
                /// 
                /// A weekend.
                /// 
                Weekend,
                /// 
                /// Morning is a workday, afternoon is the start of the weekend.
                /// 
                WorkdayMorning
            }
    
            /// 
            /// Returns the English version of the country name. Extracted from the CultureInfo.EnglishName.
            /// 
            /// The CultureInfo this object.
            /// The English version of the country name.
            public static string GetCountryEnglishName(this CultureInfo ci)
            {
                string[] parts = ci.EnglishName.Split(new[] {'(', ')'}, StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length < 2)
                    return ci.EnglishName;
                parts = parts[1].Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
                return parts[parts.Length - 1].Trim();
            }
    
            /// 
            /// Returns the English version of the language name. Extracted from the CultureInfo.EnglishName.
            /// 
            /// The CultureInfo this object.
            /// The English version of the language name.
            public static string GetLanguageEnglishName(this CultureInfo ci)
            {
                string[] parts = ci.EnglishName.Split(new[] {'('}, StringSplitOptions.RemoveEmptyEntries);
                return parts[0].Trim();
            }
    
            /// 
            /// Return if the passed in day of the week is a weekend.
            /// 
            /// note: state pulled from http://en.wikipedia.org/wiki/Workweek_and_weekend
            /// 
            /// The CultureInfo this object.
            /// The Day of the week to return the stat of.
            /// The weekday/weekend state of the passed in day of the week.
            public static WeekdayState IsWeekend(this CultureInfo ci, DayOfWeek day)
            {
                string[] items = ci.Name.Split(new[] {'-'}, StringSplitOptions.RemoveEmptyEntries);
                switch (items[items.Length - 1])
                {
                    case "DZ": // Algeria
                    case "BH": // Bahrain
                    case "BD": // Bangladesh
                    case "EG": // Egypt
                    case "IQ": // Iraq
                    case "IL": // Israel
                    case "JO": // Jordan
                    case "KW": // Kuwait
                    case "LY": // Libya
                    // Northern Malaysia (only in the states of Kelantan, Terengganu, and Kedah)
                    case "MV": // Maldives
                    case "MR": // Mauritania
                    case "NP": // Nepal
                    case "OM": // Oman
                    case "QA": // Qatar
                    case "SA": // Saudi Arabia
                    case "SD": // Sudan
                    case "SY": // Syria
                    case "AE": // U.A.E.
                    case "YE": // Yemen
                        return day == DayOfWeek.Thursday || day == DayOfWeek.Friday
                            ? WeekdayState.Weekend
                            : WeekdayState.Workday;
    
                    case "AF": // Afghanistan
                    case "IR": // Iran
                        if (day == DayOfWeek.Thursday)
                            return WeekdayState.WorkdayMorning;
                        return day == DayOfWeek.Friday ? WeekdayState.Weekend : WeekdayState.Workday;
    
                    case "BN": // Brunei Darussalam
                        return day == DayOfWeek.Friday || day == DayOfWeek.Sunday
                            ? WeekdayState.Weekend
                            : WeekdayState.Workday;
    
                    case "MX": // Mexico
                    case "TH": // Thailand
                        if (day == DayOfWeek.Saturday)
                            return WeekdayState.WorkdayMorning;
                        return day == DayOfWeek.Saturday || day == DayOfWeek.Sunday
                            ? WeekdayState.Weekend
                            : WeekdayState.Workday;
    
                }
    
                // most common Saturday/Sunday
                return day == DayOfWeek.Saturday || day == DayOfWeek.Sunday ? WeekdayState.Weekend : WeekdayState.Workday;
            }
        }
    }
    

提交回复
热议问题