Как я могу изменить, какой день является первым днем недели?

#c# #asp.net #.net #datetime

#c# #asp.net #.net #дата и время

Вопрос:

Мне нужно изменить первый день недели в asp.net , то есть я хочу, чтобы суббота была первым днем недели.

Например, приведенный ниже код должен возвращать 3 в понедельник:

 (int)DateTime.Now.DayOfWeek
  

Ответ №1:

Вы не можете повлиять на значение DateTime.DayOfWeek , поскольку это тип System.DayOfWeek , который является перечислением (т. Е. Значения являются постоянными). Определение для System.DayOfWeek находится в блоке кода ниже. Итак, если вы хотите рассматривать DayOfWeek 3 понедельник и субботу как первый день недели, то я должен предположить, что вы хотите использовать систему нумерации от 1 до 7. В этом случае вы можете сделать ((int)DateTime.Now.DayOfWeek 1) % 7 1 , чтобы получить желаемые числа. Если вам это не нужно для вычислений, было бы лучше просто сравнить значение DateTime.Now.DayOfWeek с его константами enum (например if( DateTime.Now.DayOfWeek == DayOfWeek.Monday ) ... ).

 // Summary:
//     Specifies the day of the week.
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
    // Summary:
    //     Indicates Sunday.
    Sunday = 0,
    //
    // Summary:
    //     Indicates Monday.
    Monday = 1,
    //
    // Summary:
    //     Indicates Tuesday.
    Tuesday = 2,
    //
    // Summary:
    //     Indicates Wednesday.
    Wednesday = 3,
    //
    // Summary:
    //     Indicates Thursday.
    Thursday = 4,
    //
    // Summary:
    //     Indicates Friday.
    Friday = 5,
    //
    // Summary:
    //     Indicates Saturday.
    Saturday = 6,
}
  

Комментарии:

1. Это хорошо, спасибо. Итак, если вы хотите, чтобы понедельник был первым днем недели, это ((int)DateTime.Now.DayOfWeek 6) % 7 1 …. для 1-7 … или отбросьте 1 для нумерации 0-6

Ответ №2:

Используйте следующий код, чтобы изменить первый день недели в asp.net применение.

 CultureInfo _culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
CultureInfo _uiculture = (CultureInfo)CultureInfo.CurrentUICulture.Clone();

_culture.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;
_uiculture.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Saturday;

System.Threading.Thread.CurrentThread.CurrentCulture = _culture;
System.Threading.Thread.CurrentThread.CurrentUICulture = _uiculture;
  

Комментарии:

1. Вам нужно Using System.Globalization

2. Знаете ли вы, какова жизнь этого изменения, вернется ли оно к предыдущим настройкам при следующем обращении к серверу? Спасибо

3. Это также неверно. Как указано ниже, что бы вы ни делали с текущей культурой потока, значения перечисления DayOfWeek постоянны и вернут Sunday= 0…

Ответ №3:

Я полагаю, вам просто нужно изменить используемую вами культуру (перечисление DayOfWeek).

 Thread.CurrentThread.CurrentCulture = New CultureInfo("ar-EG")
  

Комментарии:

1. Это не имеет смысла, перечисление DayOfWeek не изменится, потому что вы измените культуру потока. Индексы останутся, воскресенье = 0, понедельник = 1 и так далее.

Ответ №4:

Я создал этот метод расширения C #, который возвращает индекс на основе нуля, основанный на альтернативном первом дне недели.

DayOfWeek по умолчанию используется воскресенье = 0, понедельник = 1, …, Суббота = 6. Мы хотим, чтобы (например) DayOfWeek было понедельник = 0, вторник = 1, …, Воскресенье = 6.

Учитывая, что текущий день недели — воскресенье:

 DateTime.Now.DayOfWeek; // returns Sunday
(int)DateTime.Now.DayOfWeek; // returns 0
DateTime.Now.DayOfWeek(DayOfWeek.Monday); // returns 6    

public static class ExtensionMethods
{
    /// <summary>
    /// Returns an zero-based index where firstDayOfWeek = 0 and lastDayOfWeek = 6
    /// </summary>
    /// <param name="value"></param>
    /// <param name="firstDayOfWeek"></param>
    /// <returns>int between 0 and 6</returns>
    public static int DayOfWeek(this DateTime value, DayOfWeek firstDayOfWeek)
    {
        var idx = 7   (int)value.DayOfWeek - (int)firstDayOfWeek;
        if (idx > 6) // week ends at 6, because Enum.DayOfWeek is zero-based
        {
            idx -= 7;
        }
        return idx;
    }
}
  

Комментарии:

1. Это идеальный ответ

2. DayOfWeek, возможно, не лучшее название для такого метода, поскольку оно противоречит перечислению DayOfWeek .

Ответ №5:

 protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            if (e.Day.Date.DayOfWeek == DayOfWeek.Friday)
            {
                e.Day.IsSelectable = false;
                e.Cell.BackColor = Color.AliceBlue;
            }
        }
  

Это действительно работает. Здесь dayRender — это событие.