如何设置时间跨度为小时而不是天

本文关键字:小时 时间跨度 何设置 设置 | 更新日期: 2023-09-27 17:50:41

以下代码

Console.WriteLine("{0:%h} hours {0:%m} minutes", 
                   new TimeSpan(TimeSpan.TicksPerDay));

产生如下输出:

0 hours 0 minutes

我想要的是这样的输出:

24小时0分钟

我在这个格式字符串中缺少什么?

注:我知道我可以手动将时间跨度分解为天数和小时,并将两者相乘,但我宁愿使用自定义格式字符串,因为这些时间跨度在silverlight数据网格中显示,人们希望看到的是小时,而不是天。

如何设置时间跨度为小时而不是天

根据MSDN,使用%h将显示

时间间隔中不计入天数的完整小时数。

我认为您将需要使用TimeSpan类的TotalHours属性,如:

TimeSpan day= new TimeSpan(TimeSpan.TicksPerDay);
Console.WriteLine("{0} hours {1} minutes", (int)day.TotalHours, day.Minutes);

如果您绝对需要能够通过将自定义格式化器传递给ToString方法来实现所述格式,那么您可能需要创建自己的CustomTimeSpan类。不幸的是,您不能从struct继承,因此您必须从头开始构建它。

似乎没有一个格式选项可以从TimeSpan中获得总小时数。最好的选择是使用TotalHours属性:

var mySpan = new TimeSpan(TimeSpan.TicksPerDay);
Console.WriteLine("{0} hours {1} minutes", (int)mySpan.TotalHours, mySpan.Minutes);

TotalHours返回一个双精度值,因为它包含小数小时数,所以您需要将其截断为整数部分。

另一种可能是:

TimeSpan day = new TimeSpan(2,1,20,0); // 2.01:20:00
Console.WriteLine("{0} hours {1} minutes", (int)day.TotalHours, day.Minutes);

控制台将显示:

49小时20分钟