在.NET中获取当前的文化日名称

时间:2010-05-25 00:13:02

标签: c# .net datetime

是否可以从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 个答案:

答案 0 :(得分:10)

您可以使用custom cultures根据现有文化创建新文化。说实话,我会说这可能有点笨拙。 “最简单”的解决方案可能就像:

public string[] GetDayNames()
{
    if (CultureInfo.CurrentCulture.Name.StartsWith("en-"))
    {
        return new [] { "Monday", "Tuesday", "Wednesday", "Thursday",
                        "Friday", "Saturday", "Sunday" };
    }
    else
    {
        return CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
    }
}

答案 1 :(得分:6)

您可以克隆获取CultureInfo对象的可写副本的当前区域性。然后,您可以将DateTimeFormat.FirstDayOfWeek设置为Monday。

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

clone.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;

上述clone现在将星期一视为一周的第一天。

修改

在重新阅读你的问题后,我认为这不符合你的期望。无论FirstDayOfWeek设置如何,DayNames仍会以相同的顺序返回。

但是如果有人在将来遇到这个问题,我会把这个答案留给社区维基。

答案 2 :(得分:5)

我将此作为一个单独的答案发布,因为它与我的其他答案无关(在未来的其他情况下,这可能对其他人有用。)

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

我的意思是尽快发布,但我正在与一个垂死的外置硬盘进行战斗......

答案 3 :(得分:5)

另一个想法,灵感来自Josh的回答,使用队列而不是移动数组。

var days = CultureInfo.CurrentCulture.DateTimeFormat.DayNames;
if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "en")
{
    var q = new Queue<string>(days);
    q.Enqueue(q.Dequeue());
    days = q.ToArray();
}

答案 4 :(得分:2)

显然,

DatetimeFormatInfo.GetDayName,按照你想要的顺序在每个DayOfWeek上使用foreach。 :)没有黑客,简单而有效

答案 5 :(得分:2)

如果您根据日期获取日期名称,那么本周开始的那一天并不重要; DateTimeFormat.DayNames将星期日标识为0,与DateTime一样,无论星期四是星期还是星期几。 :)

从日期获取英文日期名称:

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

如果由于某种原因你绝对想要处理支持DayOfWeek枚举的(魔术值!)整数,只需移动索引并取模数,因此映射0 =&gt; 6,1 =&gt; 0,等等:

string GetDayName(int dayIndex)
{
    return CultureInfo.InvariantCulture.DateTimeFormat.DayNames[(dayIndex + 6) % 7]; 
}

答案 6 :(得分:0)

由于只有一天被移动,我解决了这个问题:

'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)

答案 7 :(得分:0)

这也应该很好用。

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

答案 8 :(得分:0)

另一个简单的解决方案:

var dayNames = Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames.ToList();

if (Culture.DateTimeFormat.FirstDayOfWeek == DayOfWeek.Monday)
{
    dayNames.Add(dayNames[0]);
    dayNames.RemoveAt(0);
}