是否可以从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"
答案 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);
}