Получение текущих имен дней культуры в .NET - PullRequest
9 голосов
/ 25 мая 2010

Можно ли получить 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"

Ответы [ 8 ]

10 голосов
/ 25 мая 2010

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

public string[] GetDayNames()
{
    if (CultureInfo.CurrentCulture.Name.StartsWith("en-"))
    {
        return new [] { "Monday", "Tuesday", "Wednesday", "Thursday",
                        "Friday", "Saturday", "Sunday" };
    }
    else
    {
        return CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
    }
}
6 голосов
/ 25 мая 2010

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

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

clone.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;

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

EDIT

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

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

5 голосов
/ 25 мая 2010

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

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 голосов
/ 25 мая 2010

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

В качестве альтернативы решению Codeka вы также можете сделать что-то вроде этого (что позволит избежать жесткого кодирования названий en-us day.)

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

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

2 голосов
/ 08 марта 2013

Если вы получаете названия дней на основе дат, не имеет значения, с какого дня начинается неделя; DateTimeFormat.DayNames идентифицирует воскресенье как 0, как и DateTime, независимо от того, начинаются ли недели в четверг или что у вас. :)

Чтобы получить название дня на английском языке от даты:

string GetDayName(DateTime dt)
{
    return CultureInfo.InvariantCulture.DateTimeFormat.DayNames[(int)dt.DayOfWeek];
}

Если по какой-то причине вы абсолютно хотите иметь дело с (магическим значением!) Целочисленными значениями, которые лежат в основе перечисления DayOfWeek, просто сдвиньте индекс и возьмите модуль, отсюда отображение 0 => 6, 1 => 0 и т. Д. :

string GetDayName(int dayIndex)
{
    return CultureInfo.InvariantCulture.DateTimeFormat.DayNames[(dayIndex + 6) % 7]; 
}
2 голосов
/ 22 августа 2011

DatetimeFormatInfo.GetDayName очевидно, с foreach для каждого DayOfWeek в нужном вам порядке. :) Без взлома, просто и эффективно

0 голосов
/ 08 сентября 2016

Это также должно хорошо работать.

    public static List<String> Days
    {
        var abbDayNames = CultureInfo.CurrentCulture.DateTimeFormat.AbbreviatedDayNames;

        var days = new string[7];
        var firstDayOfWeek = (int)DayOfWeek.Monday;
        for (int i = 6; i>= 0; i--)
        {
            days[i] = abbDayNames[(firstDayOfWeek + i) % 7];
        }

        return new List<string>(days);
    }
0 голосов
/ 22 января 2013

Поскольку переносится только один день, я решил эту проблему следующим образом:

'the list is from Sunday to Saturday
'we need Monday to Sunday
'so add a Sunday on the end and then remove the first position
dayNames.AddRange(DateTimeFormatInfo.CurrentInfo.DayNames)
dayNames.Add(DateTimeFormatInfo.CurrentInfo.GetDayName(DayOfWeek.Sunday))
dayNames.RemoveAt(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...