You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将缩写星期名称解析为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:25