格式化 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
将始终具有 Hours
、Minutes
、Seconds
等。TimeSpan
根本不包含任何格式(您可以在调试时看到一些,但是太神奇了...它调用 ToString
来可视化数据)。
要格式化就得放ToString()
。这将使它成为... string
。将其转换回 TimeSpan
将再次产生 Hours
、Minutes
和 Seconds
。
如果您认为那些 Seconds
对您没有用,并且您真的想摆脱它们,请基于 Reference Source of TimeSpan
创建您自己的 TimeSpanWithoutSeconds
实现.
是否可以在不使用这种方法的情况下格式化 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
将始终具有 Hours
、Minutes
、Seconds
等。TimeSpan
根本不包含任何格式(您可以在调试时看到一些,但是太神奇了...它调用 ToString
来可视化数据)。
要格式化就得放ToString()
。这将使它成为... string
。将其转换回 TimeSpan
将再次产生 Hours
、Minutes
和 Seconds
。
如果您认为那些 Seconds
对您没有用,并且您真的想摆脱它们,请基于 Reference Source of TimeSpan
创建您自己的 TimeSpanWithoutSeconds
实现.