Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding weekend days based on culture

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 workweek from Sunday through Thursday.

like image 969
sduplooy Avatar asked Jan 07 '10 08:01

sduplooy


People also ask

When did the concept of weekends began?

The USA officially adopted the five-day system in 1932, in a bid to counter the unemployment caused by the Great Depression. At around the same time, something similar was happening on the other side of the Atlantic. Henry Ford of the Ford Motor Company introduced a 40-hour week for his workers.

Why is the work week Monday through Friday?

In 1908, the first five-day workweek in the United States was instituted by a New England cotton mill so that Jewish workers would not have to work on the Sabbath from sundown Friday to sundown Saturday.

Which day is called weekend in India?

The weekend is most commonly considered the period between Friday evening and the end of Sunday. More strictly speaking, the weekend is thought to consist of Saturday and Sunday (often regardless of whether the calendar week is considered to begin on Sunday or Monday).


1 Answers

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;
        }
    }
}
like image 165
David Thielen Avatar answered Nov 04 '22 22:11

David Thielen