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.
-
I think that .net framework does not support this feature. You have to implement with your own model. – mkus Jan 07 '10 at 11:02
-
1A similar was question was asked [if .NET already supports this](http://stackoverflow.com/questions/10558065/net-globalization-isweekend). The answer is that it does not; you'll have to roll your own. – Ian Boyd May 16 '12 at 19:24
5 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;
}
}
}

- 28,723
- 34
- 119
- 193
-
so this is better? default: throw new NotImplementedException(); ,or // most common Saturday/Sunday return day == DayOfWeek.Saturday || day == DayOfWeek.Sunday ? WeekdayState.Weekend : WeekdayState.Workday; because it's common? i mean how common it is – Hassan Faghihi Feb 24 '15 at 06:21
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.

- 2,957
- 3
- 25
- 46
-
this wont help, as it doesn't says if this culture have two day as weekend or one day – Hassan Faghihi Feb 24 '15 at 06:09
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

- 13
- 2
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!

- 38,334
- 103
- 306
- 551
found the question interesting - did not have an answer myself.. but located an interesting resource - also discussing calendars.

- 290
- 2
- 7