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

C# 如何正确使用String.Format从日期字符串提取年月用于分组

错误原因

你之前的代码无法正确格式化的核心原因是:String.Format 的日期格式化占位符仅对 DateTime 类型的参数生效,你直接传入了字符串类型的 DataCupom,格式化规则不会生效。

正确实现步骤

  1. 首先将固定格式的日期字符串解析为 DateTime 类型对象
  2. 再对 DateTime 对象做格式化提取月份和年份

基础版本(确认日期字符串一定合法的场景)

// 原存储dd/MM/yyyy格式日期的字符串属性
public string DataCupom { get; set; }

// 输出月年格式的属性
public string DataCupomAgrupadoMes 
{ 
    get 
    { 
        // 按固定格式解析日期字符串,指定固定文化避免系统区域设置影响解析结果
        DateTime cupomDate = DateTime.ParseExact(DataCupom, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
        // 格式化输出为 月份/年份 格式,你也可以根据需求调整为比如 yyyy-MM 等其他格式
        return cupomDate.ToString("MM/yyyy");
        // 用String.Format写法效果完全一致:return String.Format("{0:MM/yyyy}", cupomDate);
    } 
}

兼容异常版本(日期字符串可能存在非法值的场景)

如果业务场景不能保证DataCupom一定是合法日期,可以用TryParseExact避免抛出异常:

public string DataCupomAgrupadoMes 
{ 
    get 
    { 
        if (DateTime.TryParseExact(DataCupom, "dd/MM/yyyy", 
            System.Globalization.CultureInfo.InvariantCulture, 
            System.Globalization.DateTimeStyles.None, 
            out DateTime cupomDate))
        {
            return cupomDate.ToString("MM/yyyy");
        }
        // 解析失败的返回值可根据业务需求自定义
        return string.Empty;
    } 
}

分组优化建议

如果你需要做GroupBy操作,也可以直接解析为DateTime后用Year和Month属性作为分组键,不需要转成字符串,强类型分组键更稳定,不会因为格式、分隔符的差异导致分组错误:

// 分组示例
var groupByResult = 数据源
    .GroupBy(item => {
        var date = DateTime.ParseExact(item.DataCupom, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
        return new { date.Year, date.Month };
    });

内容的提问来源于stack exchange,提问作者Favieri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:03