Получение текущего дня культуры называет в.NET

Действительно ли возможно добраться CurrentCultureрабочие дни от DateTimeFormatInfo, но возвращаясь в понедельник как первый день недели вместо воскресенья. И, если текущая культура не является английской (т.е. код ISO не является "en"), затем оставляют его как значение по умолчанию.

По умолчанию CultureInfo.CurrentCulture.DateTimeFormat.DayNames возвраты:

[0]: "Sunday"
[1]: "Monday"
[2]: "Tuesday"
[3]: "Wednesday"
[4]: "Thursday"
[5]: "Friday"
[6]: "Saturday" 

Но мне нужно:

[0]: "Monday"
[1]: "Tuesday"
[2]: "Wednesday"
[3]: "Thursday"
[4]: "Friday"
[5]: "Saturday" 
[6]: "Sunday"
9
задан Chris Fulstow 25 May 2010 в 00:13
поделиться

4 ответа

Вы можете использовать пользовательские культуры для создания новой культуры на основе существующей. Хотя, честно говоря, я бы сказал, что это, вероятно, немного тяжеловато. Самым "простым" решением может быть что-то вроде:

public string[] GetDayNames()
{
    if (CultureInfo.CurrentCulture.Name.StartsWith("en-"))
    {
        return new [] { "Monday", "Tuesday", "Wednesday", "Thursday",
                        "Friday", "Saturday", "Sunday" };
    }
    else
    {
        return CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
    }
}
10
ответ дан 4 December 2019 в 07:22
поделиться

Еще одна идея, вдохновленная ответом Джоша, - использовать очередь вместо смещения массива.

var days = CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "en")
{
    var q = new Queue<string>(days);
    q.Enqueue(q.Dequeue());
    days = q.ToArray();
}
5
ответ дан 4 December 2019 в 07:22
поделиться

Вы можете клонировать текущий язык и региональные параметры, который получает доступную для записи копию объекта CultureInfo. Затем вы можете установить DateTimeFormat.FirstDayOfWeek на понедельник.

CultureInfo current = CultureInfo.Current;
CultureInfo clone = (CultureInfo)current.Clone();

clone.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;

Вышеупомянутый клон теперь будет рассматривать понедельник как первый день недели.

РЕДАКТИРОВАТЬ

Перечитав ваш вопрос, я не думаю, что это сделает то, что вы ожидаете. DayNames по-прежнему будут возвращаться в том же порядке, независимо от настройки FirstDayOfWeek .

Но я оставлю этот ответ как вики сообщества на случай, если кто-то столкнется с этим вопросом в будущем.

6
ответ дан 4 December 2019 в 07:22
поделиться

Я размещаю это как отдельный ответ, поскольку он не имеет никакого отношения к моему другому ответу (который может быть полезен кому-то в будущем в другом контексте)

Как альтернатива решению codeka, вы можете сделать что-то вроде этого (что позволит избежать необходимости жестко кодировать названия дней en-us)

string[] dayNamesNormal = culture.DateTimeFormat.DayNames;
string[] dayNamesShifted = Shift(dayNamesNormal, (int)DayOfWeek.Monday);

// you probably wanna add some error checking here.
// this method shifts array left by a specified number
// of positions, wrapping the shifted elements back to
// end of the array
private static T[] Shift<T>(T[] array, int positions) {
    T[] copy = new T[array.Length];
    Array.Copy(array, 0, copy, array.Length-positions, positions);
    Array.Copy(array, positions, copy, 0, array.Length-positions);
    return copy;
}

Я хотел разместить это раньше, но я борюсь с умирающим внешним жестким диском...

5
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: