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

如何无需显式检查CultureInfo,按系统文化格式化带序数词的DateTime?

解决方案

可以通过利用当前系统文化的日期格式规则自动调整日月顺序,同时自定义处理序数词(st/nd/rd/th)的方式实现需求,无需显式判断CultureInfo类型。

实现步骤

  • 编写序数词生成方法:根据日期的日数返回对应的后缀(st/nd/rd/th)。
  • 自动识别当前文化的日月顺序:通过DateTimeFormat.ShortDatePattern判断日和月在格式中的先后位置,避免硬编码文化判断。
  • 拼接本地化的月缩写、带序数词的日和年份,按文化对应的顺序组合。

完整代码示例

using System;
using System.Globalization;
using System.Threading;

public static class DateFormatter
{
    // 生成序数词后缀
    private static string GetOrdinalSuffix(int day)
    {
        return day switch
        {
            1 or 21 or 31 => "st",
            2 or 22 => "nd",
            3 or 23 => "rd",
            _ => "th"
        };
    }

    // 格式化日期为带序数词的本地化格式
    public static string FormatDateWithOrdinal(DateTime date)
    {
        var dateFormat = CultureInfo.CurrentCulture.DateTimeFormat;
        // 从短日期格式判断日和月的先后顺序
        bool isDayFirst = dateFormat.ShortDatePattern.IndexOf('d') < dateFormat.ShortDatePattern.IndexOf('M');

        string dayWithOrdinal = $"{date.Day}{GetOrdinalSuffix(date.Day)}";
        // 按当前文化获取月的缩写
        string localizedMonth = date.ToString("MMM", CultureInfo.CurrentCulture);
        string year = date.Year.ToString();

        return isDayFirst 
            ? $"{dayWithOrdinal} {localizedMonth} {year}" 
            : $"{localizedMonth} {dayWithOrdinal} {year}";
    }
}

// 测试示例
class Program
{
    static void Main()
    {
        // 切换为en-GB文化
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
        Console.WriteLine(DateFormatter.FormatDateWithOrdinal(new DateTime(2023, 5, 1)));
        // 输出:1st May 2023

        // 切换为en-US文化
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        Console.WriteLine(DateFormatter.FormatDateWithOrdinal(new DateTime(2023, 5, 1)));
        // 输出:May 1st 2023
    }
}

原理说明

  • 序数词处理:通过分支判断覆盖所有日数的后缀规则,保证准确性。
  • 文化自适应:利用CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern的字符顺序,自动识别当前文化是“日在前”还是“月在前”,无需显式判断文化代码。
  • 本地化月缩写:使用ToString("MMM", CultureInfo.CurrentCulture)自动获取当前文化下的月份缩写,确保格式符合当地习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:45:59