C# Timespan - 用户定义的客户格式说明符

Posted

技术标签:

【中文标题】C# Timespan - 用户定义的客户格式说明符【英文标题】:C# Timespan - User defined customer format specifier 【发布时间】:2021-05-08 10:53:59 【问题描述】:

有什么方法可以用我自己的新格式说明符扩展时间跨度自定义格式说明符(请参阅下面的文档 URL)?

文档网址:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-timespan-format-strings

也许像 'ww' 来显示“总分钟数”

var myTimeSpan = new TimeSpan(1, 20, 10);
Console.Writeline(myTimeSpan.ToString("ww:ss"));

上述代码的预期结果是:

80:10

【问题讨论】:

【参考方案1】:

您必须为ICustomFormatter 创建一个实现。当您转换为字符串时,您必须提供该实现。需要注意的是,简单地调用 ToString overload on the TimeSpan that accepts an IFormatProvider 是行不通的,因为它总是需要一个 DateTimeFormatInfo 实例。

这是一个 CustomFormatter,可以满足您的需求:

class TotalMinutesFormatter:ICustomFormatter, IFormatProvider

    // IFormatProvider.GetFormat 
    public object GetFormat(Type formatType)
    
        //return ourself
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    
    
    // ICustomFormatter.Format fmt will have ww:ss and value will be the TimeSpan
    public string Format(string fmt, object value, IFormatProvider fp)
    
      if (value is TimeSpan) 
         var ts = (TimeSpan) value;
         var sb = new StringBuilder();
         switch(fmt)
         
            case "ww:ss":
                // calc minutes
                var minutes = ts.Hours*60+ts.Minutes;
                sb.AppendFormat("0:00:1:00", minutes, ts.Seconds);
                break;
            default:
                // non recognized format
                sb.AppendFormat(fmt,value);
            break;
         
         return sb.ToString(); // the TimeSpan as string
      
      // default fallback
      return String.Format(fmt,value);
    

以下是您需要如何使用格式化程序:

var myTimeSpan = new TimeSpan(1, 20, 10);
Console.WriteLine(String.Format(new TotalMinutesFormatter(), "0:ww:ss", myTimeSpan));

同样,myTimeSpan.ToString("ww:ss", new TotalMinutesFormatter()) 将不起作用并导致 FormatException:

输入的字符串格式不正确

如果您提供了一个 CustomFormatter,TimeSpan.ToString 的内部实现不支持。

【讨论】:

嗨勒内。谢谢你的详细回答。使用 ICustomFormatter 似乎是最接近的。但是,它不会完全达到目的,因为 ToString() 不起作用,我相信这也不能在 XAML 中使用。

以上是关于C# Timespan - 用户定义的客户格式说明符的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中处理 TimeSpan 异常

格式化 TimeSpan 字符串

如何在 .NET 中使用自定义格式对 TimeSpan 对象进行 String.Format ?

如何将 ISO8601 TimeSpan 转换为 C# TimeSpan?

C# 计算两个日期的时间间隔

C# 计算两个日期的时间间隔