Finding weekend days based on culture

后端 未结 5 657
礼貌的吻别
礼貌的吻别 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:04

    I won't give you a .NET answer, but I will say that you won't base it on "culture", but rather on country.

    You can get country from IP with a fir degree of accuracy (but it will never be 100%). After that, I would suggest a lot of googling, because I doubt that you are going to find the code already written.

    (you might also look into some open source calendar/appointment programs, especially widely-used ones, like on Linux, or maybe Lightning, the Thunderbird plug-in. If you wade through their code, you might find the data for this)

    Fortunately, though, you just face a grind, rather than something difficult to implement.

    Good luck!

    0 讨论(0)
  • 2020-12-19 03:16

    found the question interesting - did not have an answer myself.. but located an interesting resource - also discussing calendars.

    Calendar converter

    0 讨论(0)
  • 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
    {
        /// <summary>
        /// Extensions for the CultureInfo class.
        /// </summary>
        public static class CultureInfoExtensions
        {
            /// <summary>
            /// The weekday/weekend state for a given day.
            /// </summary>
            public enum WeekdayState
            {
                /// <summary>
                /// A work day.
                /// </summary>
                Workday,
                /// <summary>
                /// A weekend.
                /// </summary>
                Weekend,
                /// <summary>
                /// Morning is a workday, afternoon is the start of the weekend.
                /// </summary>
                WorkdayMorning
            }
    
            /// <summary>
            /// Returns the English version of the country name. Extracted from the CultureInfo.EnglishName.
            /// </summary>
            /// <param name="ci">The CultureInfo this object.</param>
            /// <returns>The English version of the country name.</returns>
            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();
            }
    
            /// <summary>
            /// Returns the English version of the language name. Extracted from the CultureInfo.EnglishName.
            /// </summary>
            /// <param name="ci">The CultureInfo this object.</param>
            /// <returns>The English version of the language name.</returns>
            public static string GetLanguageEnglishName(this CultureInfo ci)
            {
                string[] parts = ci.EnglishName.Split(new[] {'('}, StringSplitOptions.RemoveEmptyEntries);
                return parts[0].Trim();
            }
    
            /// <summary>
            /// Return if the passed in day of the week is a weekend.
            /// 
            /// note: state pulled from http://en.wikipedia.org/wiki/Workweek_and_weekend
            /// </summary>
            /// <param name="ci">The CultureInfo this object.</param>
            /// <param name="day">The Day of the week to return the stat of.</param>
            /// <returns>The weekday/weekend state of the passed in day of the week.</returns>
            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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-19 03:22

    The only thing i know is how to get the day the week starts. Perhaps this can help:

    CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
    

    from System.Globalization, perhaps you find in this package something.

    There are several Calendar-Classses like JulianCalendar, HebrewCalendar and so on. It could be possible to find there what you want.

    0 讨论(0)
  • 2020-12-19 03:25

    The below code will work till the time last 2 days are considered as weekends in cultures.

    :)

    /// <summary>
    /// Returns true if the specified date is weekend in given culture
    /// is in. 
    /// </summary>
    public static bool IsItWeekend(DateTime currentDay, CultureInfo cultureInfo)
    {
        bool isItWeekend = false;
    
        DayOfWeek firstDay = cultureInfo.DateTimeFormat.FirstDayOfWeek;
    
        DayOfWeek currentDayInProvidedDatetime = currentDay.DayOfWeek;
    
        DayOfWeek lastDayOfWeek = firstDay + 4;
    
        if (currentDayInProvidedDatetime == lastDayOfWeek + 1 || currentDayInProvidedDatetime == lastDayOfWeek + 2)
            isItWeekend = true;
    
        return isItWeekend;         
    }
    

    Amit Tonk

    0 讨论(0)
提交回复
热议问题