格式化 TimeSpan 而不将其转换为字符串

Formatting a TimeSpan without turning it to a string

是否可以在不使用这种方法的情况下格式化 TimeSpan 对象:

TimeSpan timeSpan = new TimeSpan(1,1,0);

var formattedTimeSpan = timeSpan.ToString(@"hh\:mm");

问这个问题的目的是,我其实想做上面的事情,但又不想以字符串结尾;因为我仍然需要将格式化输出作为 TimeSpan 而不是字符串来处理。格式化后将其转换回 TimeSpan 会将其默认设置回不需要的格式 hh:mm:ss.

更新回复@Idle_Mind 以显示问题的基础:

这一切都在一个 MVC 项目中。我正在尝试生成一个时间选择器下拉列表,它将在@Html.DropDownListFor 标记中使用..

问题是下拉列表项以 hh:mm:ss 的格式显示。我不想使用 ToString() 对其进行格式化,因为我不想将模型 属性 类型从 TimeSpan 更改为 String。 属性 需要保持其原始类型的 TimeSpan,否则进行该更改时会有很多倒退。

好的 - 编码讨论在这里:

这就是我生成下拉列表项的方式:

/// <summary>
/// Provides a listItems of opening hours to use in an HTML DropDownListFor helper. 
/// </summary>
/// <param name="slotObject"></param>
/// <returns></returns>
public static List<SelectListItem> GetOpeningHours(TimeSpan time)
{
    // These could be later exposed in the webconfig if needed.
    var startTime = new TimeSpan(7, 0, 0);
    var closingTime = new TimeSpan(22,0,0);
    var incrementer = new TimeSpan(0, 15, 0);

    var timesList = new List<TimeSpan>();

    var newTime = startTime.Add(incrementer);

    for (TimeSpan i = startTime; i<closingTime; i+=incrementer)
    {
        timesList.Add(TimeSpan.Parse(i.Add(incrementer).ToString(@"hh\:mm")));
    }

    return GetDropDownList(timesList, time);
}

/// <summary>
/// Gets List Items in Text only, instead of a combination of text and value.
/// </summary>
/// <param name="selectOptions"></param>
/// <param name="selectedOption"></param>
/// <returns></returns>
private static List<SelectListItem> GetDropDownList(List<TimeSpan> selectOptions, TimeSpan selectedOption)
{
    var listItems = new List<SelectListItem>();

    foreach (var option in selectOptions)
    {
        listItems.Add(new SelectListItem
        {
            Text = option.ToString(),
            Selected = TimeSpan.Compare(option, selectedOption) == 0
        });
    }
    return listItems;
}

这就是我在 Razor 中使用它的方式

@Html.DropDownListFor(x => x.StartFrom, Website.ViewModels.ViewHelpers.OpeningTimesList.GetOpeningHours(Model.StartFrom), new { @class = "form-control" })

它是这样显示的:

问题又来了:

我想停止这种丑陋的展示。我现在正在考虑更新上面的代码以显示两个项目:一个用于 DropdownListItem 文本(其中包含字符串格式的格式化字符串),另一个用于值,实际上是 TimeSpan - 我认为这应该有效但让我知道它是否不会;我将不胜感激。

我会用结果更新这个。

非常感谢。

你不能"format"一个对象。打印时会发生格式化。所以只要在任何你想要 TimeSpan 的地方使用你的 timeSpan 实例,最后调用 .ToString() 来格式化它。

你不能那样做。 TimeSpan 只是一个 struct 包含一些数据,整数。 TimeSpan 将始终具有 HoursMinutesSeconds 等。TimeSpan 根本不包含任何格式(您可以在调试时看到一些,但是太神奇了...它调用 ToString 来可视化数据)。

要格式化就得放ToString()。这将使它成为... string。将其转换回 TimeSpan 将再次产生 HoursMinutesSeconds

如果您认为那些 Seconds 对您没有用,并且您真的想摆脱它们,请基于 Reference Source of TimeSpan 创建您自己的 TimeSpanWithoutSeconds 实现.