Поиск выходных дней на основе культуры - PullRequest
10 голосов
/ 07 января 2010

Есть ли способ найти дни, которые составляют выходные или рабочую неделю на основе разных культур, с помощью .NET Framework? Например, в некоторых мусульманских странах рабочая неделя с воскресенья по четверг.

Ответы [ 5 ]

3 голосов
/ 20 октября 2013

Ни у кого не было решения для этого, поэтому я написал одно. При этом используется страна, чтобы определить, является ли рабочий день рабочим днем, выходным или 1/2 рабочего дня (в некоторых странах суббота). В этом есть некоторая двусмысленность, поскольку в Мексике полдня в субботу является «обычным», но не официальным. Для таких случаев я установил его как рабочее время.

Это охватывает все, кроме 3 провинций Малайзии, которые отличаются от остальной части Малайзии. AFAIK, CultureInfo.Name не имеет четкого значения для этих 3 провинций. Самая интересная страна, Бруней, где выходные - пятница и воскресенье, а суббота - рабочий день.

Код можно загрузить в виде проекта на Это выходные ? Основной код ниже:

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;
        }
    }
}
3 голосов
/ 07 января 2010

Единственное, что я знаю, это как узнать день начала недели. Возможно, это может помочь:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek

из System.Globalization, возможно, вы найдете в этом пакете что-то.

Есть несколько Классов Календаря, таких как JulianCalendar, HebrewCalendar и так далее. Там можно найти то, что вы хотите.

0 голосов
/ 12 октября 2013

Приведенный ниже код будет работать до тех пор, пока последние 2 дня в культурах не будут считаться выходными.

:)

/// <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;         
}

Амит Тонк

0 голосов
/ 07 января 2010

нашел вопрос интересным - сам не получил ответа .. но нашел интересный ресурс - тоже обсуждает календари.

Календарь конвертер

0 голосов
/ 07 января 2010

Я не дам вам ответ .NET, но скажу, что вы не будете основывать его на "культуре", а скорее на стране.

Вы можете получить страну по IP с высокой степенью точности (но она никогда не будет 100%). После этого я бы предложил много гуглить, потому что сомневаюсь, что вы найдете код, уже написанный.

(вы также можете заглянуть в некоторые программы с открытым исходным кодом для календаря / встреч, особенно широко используемые, такие как в Linux, или, возможно, Lightning, плагин Thunderbird. Если вы разберетесь с их кодом, вы можете найти данные для это)

Однако, к счастью, вы просто столкнулись с трудностями, а не чем-то сложным для реализации.

Удачи!

...