代码之家  ›  专栏  ›  技术社区  ›  Chris Fulstow

在.NET中获取当前区域性日名称

  •  9
  • Chris Fulstow  · 技术社区  · 14 年前

    有可能得到 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 回复  |  直到 8 年前
        1
  •  10
  •   Dean Harding    14 年前

    你可以使用 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;
        }
    }
    
        2
  •  6
  •   Josh Einstein    14 年前

    可以克隆当前区域性,该区域性获取CultureInfo对象的可写副本。然后可以将datetimeformat.firstdayofweek设置为星期一。

    CultureInfo current = CultureInfo.Current;
    CultureInfo clone = (CultureInfo)current.Clone();
    
    clone.DateTimeFormat.FirstDayOfWeek = DayOfWeek.Monday;
    

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

    编辑

    在重新阅读了你的问题之后,我认为这不会达到你期望的效果。不管 FirstDayOfWeek 设置。

    但我会留下这个答案作为社区维基,以防将来有人遇到这个问题。

        3
  •  5
  •   Josh    14 年前

    我把它作为一个单独的答案发布,因为它与我的另一个答案没有任何关系(在未来的另一个上下文中,这可能对其他人有用)。

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

    我本想早点发布这篇文章,但我正在与一个即将消失的外部硬盘作斗争…

        4
  •  5
  •   Chris Fulstow    14 年前

    另一个想法是,在乔希的回答的启发下,使用队列而不是移动数组。

    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
  •  2
  •   Nicolas Dorier    13 年前

    DatetimeFormatInfo.GetDayName 很明显,每周的每一天都有一个前臂按你想要的顺序排列。:)不黑客,简单有效

        6
  •  2
  •   The Dag    11 年前

    如果要根据日期获取日名称,则不管星期几开始;datetimeformat.day names将星期日标识为0,而datetime则将星期日标识为0,无论星期几是从星期四开始还是从星期几开始。:)

    要从日期获取英文日名,请执行以下操作:

    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]; 
    }
    
        7
  •  0
  •   cjbarth    11 年前

    因为只有一天要搬家,我就这样解决了这个问题:

    '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)
    
        8
  •  0
  •   Gondil    8 年前

    这也应该很有效。

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