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

时间:2015-08-05 15:37:49

标签: c# timespan

无论如何都要在不使用此方法的情况下格式化TimeSpan对象:

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

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

提出这个问题的目的是我实际上想要做上述事情而不是以字符串结尾;因为我仍然需要使用格式化的输出作为TimeSpan而不是字符串。格式化后将其重新投射回TimeSpan,将其默认为不需要的hh:mm:ss格式。

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

这一切都在MVC项目中。我正在尝试生成一个Time picker下拉列表,它将在@ 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" })

这就是它的显示方式:

enter image description here

问题再次出现:

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

我会用结果更新这个。

非常感谢。

2 个答案:

答案 0 :(得分:4)

你不能格式化&#34;一个东西。打印时会进行格式化。因此,只需在timeSpan的任何地方继续使用TimeSpan实例,最后调用.ToString()进行格式打印即可。

答案 1 :(得分:2)

你做不到。 TimeSpan只是一个struct,包含一些数据,整数。 TimeSpan始终有HoursMinutesSeconds等。TimeSpan根本不包含任何格式(调试时可以看到一些,但是只是魔术......它调用ToString来显示数据。)

如果要对其进行格式化,则必须将其ToString()。这将使...... string。将其转换回TimeSpan将再次产生HoursMinutesSeconds

如果您认为Seconds对您没用,并且您真的想摆脱它们,请根据Reference Source of TimeSpan创建自己的TimeSpanWithoutSeconds实现。< / p>