c# - 将工作日缩写字符串(包括范围)转换为 List<DayOfWeek>

标签 c# string parsing datetime dayofweek

我有字符串“Mon-Thu, Sun”。

我需要将它转换成 new List<DayOfWeek>{DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Sunday}

我考虑将此字符串拆分为字符串数组,然后将字符串解析为日期格式为“ddd”的 DateTime。但我需要以某种方式检测“-”符号在哪里以及“,”在哪里。

但是下一个代码失败了

        var str = "Mon-Thu, Sun";
        var split = str.Split(new []{',', '-'});

        foreach(var item in split){
            Console.WriteLine(item.Trim());
            var day = DateTime.ParseExact(item.Trim(), "ddd", CultureInfo.InvariantCulture);
            Console.WriteLine(day.ToShortDateString());
        }

错误“字符串未被识别为有效的日期时间,因为星期几不正确。”

最佳答案

事实证明,C# 库确实维护了一个日期缩写列表,如果您不喜欢它们,您甚至可以更改它们。具体来说,我指的是 CultureInfo.[culture].DateTimeFormat.AbbreviatedDayNames

InvariantCulture 使用与您在问题中列出的相同的缩写来表示星期一、星期四和星期日。

给定日期名称的缩写,您应该能够在 AbbreviatedDayNames 数组中导出缩写名称的索引,该索引与 DayOfWeek 使用的索引相匹配。

对我来说,这种方法似乎比将文字字符串嵌入代码要好。

public static void Main()
{
    var dayList = new List<DayOfWeek>();
    var str = "Mon-Thu, Sun";

    str = str.Replace(" ", string.Empty);   // remove spaces

    // split groups by comma
    var split = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

    foreach (var item in split) // process each group
    {
        // split ranges by hyphen
        var elements = item.Split(new[] {'-'}, StringSplitOptions.RemoveEmptyEntries);  // split group into elements
        switch (elements.Length)
        {
            case 1:
                // add single element
                dayList.Add((DayOfWeek) GetDayIndex(elements[0]));
                break;
            case 2:
                // add range of elements
                dayList.AddRange(GetDayRange(elements[0], elements[1]));
                break;
            default:
                Console.WriteLine($"Input line does not match required format: \"{str}\"");
                break;
        }
    }
    // prove it works
    Console.WriteLine(string.Join(", ", dayList));
}

private static int GetDayIndex(string dayNameAbbreviation)
{
    return Array.IndexOf(CultureInfo.InvariantCulture.DateTimeFormat.AbbreviatedDayNames, dayNameAbbreviation);
}

private static IEnumerable<DayOfWeek> GetDayRange(string beginDayNameAbbrev, string endDayNameAbbrev)
{
    var dayRange = new List<DayOfWeek>();

    for (var i = GetDayIndex(beginDayNameAbbrev); i <= GetDayIndex(endDayNameAbbrev); i++)
    {
        dayRange.Add((DayOfWeek) i);
    }
    return dayRange;
}

编辑

如上所述,如果您不喜欢特定文化使用的日期缩写,您可以暂时更改它们。要了解如何操作,请查看这个 Stack Overflow 问题:How to change DateTimeFormatInfo.CurrentInfo AbbreviatedDayNames collection .

关于c# - 将工作日缩写字符串(包括范围)转换为 List<DayOfWeek>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579094/

相关文章:

c# - WPF:确定 MouseBinding 是单击还是双击

c# - 回发 ASP NET 上未选中复选框

string - Rust 的 `String` 和 `str` 有什么区别?

c# - 用于解析姓氏有前缀的名称的正则表达式

c# - 什么时候分配和租用阵列更合适?

c# - UpdatePanel 停止 Javascript 工作

c - 不使用库函数查找字符串长度

regex - R/正则表达式与 stringi/ICU : why is a '+' considered a non-[:punct:] character?

python - 一种确定两个句子相似程度的算法

java - 当我使用 json.org 解析时出现 JSON 错误