如何将缩写星期名称解析为NodaTime.IsoDayOfWeek?
解析缩写星期名称为NodaTime.IsoDayOfWeek
方法一:构建固定映射字典(高效优先)
由于CultureInfo.InvariantCulture的缩写星期名称是固定的(Sun, Mon, Tue, Wed, Thu, Fri, Sat),直接构建映射字典是最高效的方案,无需依赖日期解析逻辑:
using System.Globalization; using NodaTime; // 大小写不敏感的映射字典 private static readonly Dictionary<string, IsoDayOfWeek> InvariantAbbrDayMap = new(StringComparer.InvariantCultureIgnoreCase) { ["Sun"] = IsoDayOfWeek.Sunday, ["Mon"] = IsoDayOfWeek.Monday, ["Tue"] = IsoDayOfWeek.Tuesday, ["Wed"] = IsoDayOfWeek.Wednesday, ["Thu"] = IsoDayOfWeek.Thursday, ["Fri"] = IsoDayOfWeek.Friday, ["Sat"] = IsoDayOfWeek.Saturday }; // 使用示例 if (InvariantAbbrDayMap.TryGetValue("Fri", out var isoDay)) { // 处理解析得到的isoDay }
方法二:利用NodaTime内置模式解析
如果偏好使用NodaTime的原生解析能力,需注意不要绑定固定模板日期(这是你之前解析失败的核心原因)。直接创建仅包含星期缩写的模式,解析后提取星期部分即可:
using System.Globalization; using NodaTime; using NodaTime.Text; public static IsoDayOfWeek ParseAbbreviatedDay(string abbrDay) { // 创建不变文化下的星期缩写模式 var pattern = LocalDatePattern.CreateWithInvariantCulture("ddd"); // 可选:开启大小写不敏感解析 pattern = pattern.WithParserOptions(opt => opt.WithCaseInsensitiveParse(true)); var result = pattern.Parse(abbrDay); if (!result.Success) { throw new ArgumentException($"无效的星期缩写: {abbrDay}", nameof(abbrDay)); } // 提取解析结果中的星期枚举 return result.Value.DayOfWeek; } // 使用示例 var saturday = ParseAbbreviatedDay("Sat");
为什么之前的尝试失败?
你之前使用带固定LocalDate模板的LocalDatePattern,会强制要求输入的星期与模板日期的星期一致。而不绑定模板日期时,NodaTime会自动匹配任意星期缩写,返回一个包含对应星期的LocalDate(日期部分为默认值,不影响我们提取星期)。
内容的提问来源于stack exchange,提问作者Bartosz
相关产品推荐
相关产品推荐

