我有两个 DateTime 变量,beginTime 和 endTime。我通过以下方式得到它们之间的差:
TimeSpan dateDifference = endTime.Subtract(beginTime);
如何使用C#将时间差以hh小时mm分钟ss秒的格式返回字符串。
如果时间差为00:06:32.4458750
则应该返回00小时06分钟32秒
我刚刚编写了一些TimeSpan扩展方法,想分享一下:
public static string ToReadableAgeString(this TimeSpan span)
{
return string.Format("{0:0}", span.Days / 365.25);
}
public static string ToReadableString(this TimeSpan span)
{
string formatted = string.Format("{0}{1}{2}{3}",
span.Duration().Days > 0 ? string.Format("{0:0} day{1}, ", span.Days, span.Days == 1 ? string.Empty : "s") : string.Empty,
span.Duration().Hours > 0 ? string.Format("{0:0} hour{1}, ", span.Hours, span.Hours == 1 ? string.Empty : "s") : string.Empty,
span.Duration().Minutes > 0 ? string.Format("{0:0} minute{1}, ", span.Minutes, span.Minutes == 1 ? string.Empty : "s") : string.Empty,
span.Duration().Seconds > 0 ? string.Format("{0:0} second{1}", span.Seconds, span.Seconds == 1 ? string.Empty : "s") : string.Empty);
if (formatted.EndsWith(", ")) formatted = formatted.Substring(0, formatted.Length - 2);
if (string.IsNullOrEmpty(formatted)) formatted = "0 seconds";
return formatted;
}
可扩展
:( 但它肯定是正确的方向,你应该在这里接受一个像“hh:mm”这样的字符串,并根据它构建时间。就像ToString()
一样,我认为@rubenroid的答案是最好的答案。 - Piotr KulaTimeSpan
中最重要的部分,例如“2天前”或“15分钟前”,那么请查看受@Peter anwear启发的此代码片段:https://gist.github.com/Rychu-Pawel/fefb89e21b764e97e4993ff517ff0129 - Rychu通过将其转换为datetime,您可以获得本地化格式:
new DateTime(timeSpan.Ticks).ToString("HH:mm");
这是最短的解决方案。
timeSpan.ToString(@"hh\:mm");
你是否可以利用TimeSpan.ToString()方法完成所需的操作?如果不行, 那么该页面上的代码示例似乎描述了如何自定义格式化TimeSpan
对象。
ToString
方法可以接受自定义格式作为参数(例如mm\\:ss
),具体请参见此页面:http://msdn.microsoft.com/en-us/library/dd992632.aspx。 - JYLusing System;
namespace TimeSpanFormat
{
class Program
{
static void Main(string[] args)
{
TimeSpan dateDifference = new TimeSpan(0, 0, 6, 32, 445);
string formattedTimeSpan = string.Format("{0:D2} hrs, {1:D2} mins, {2:D2} secs", dateDifference.Hours, dateDifference.Minutes, dateDifference.Seconds);
Console.WriteLine(formattedTimeSpan);
}
}
}
public static class TimeSpanFormattingExtensions
{
public static string ToReadableString(this TimeSpan span)
{
return string.Join(", ", span.GetReadableStringElements()
.Where(str => !string.IsNullOrWhiteSpace(str)));
}
private static IEnumerable<string> GetReadableStringElements(this TimeSpan span)
{
yield return GetDaysString((int)Math.Floor(span.TotalDays));
yield return GetHoursString(span.Hours);
yield return GetMinutesString(span.Minutes);
yield return GetSecondsString(span.Seconds);
}
private static string GetDaysString(int days)
{
if (days == 0)
return string.Empty;
if (days == 1)
return "1 day";
return string.Format("{0:0} days", days);
}
private static string GetHoursString(int hours)
{
if (hours == 0)
return string.Empty;
if (hours == 1)
return "1 hour";
return string.Format("{0:0} hours", hours);
}
private static string GetMinutesString(int minutes)
{
if (minutes == 0)
return string.Empty;
if (minutes == 1)
return "1 minute";
return string.Format("{0:0} minutes", minutes);
}
private static string GetSecondsString(int seconds)
{
if (seconds == 0)
return string.Empty;
if (seconds == 1)
return "1 second";
return string.Format("{0:0} seconds", seconds);
}
}
格式化 TimeSpan
最简单的方法是将其添加到 DateTime
并进行格式化:
string formatted = (DateTime.Today + dateDifference).ToString("HH 'hrs' mm 'mins' ss 'secs'");
只要时间差不超过24小时,这个方法就可以工作。
Today
属性返回一个DateTime
值,其中时间组件为零,因此结果的时间组件是TimeSpan
值。
dateDifference.Hours.ToString() + " hrs, " + dateDifference.Minutes.ToString() + " mins, " + dateDifference.Seconds.ToString() + " secs"
public static class TimeSpanExtensions
{
public static String Verbose(this TimeSpan timeSpan)
{
var hours = timeSpan.Hours;
var minutes = timeSpan.Minutes;
if (hours > 0) return String.Format("{0} hours {1} minutes", hours, minutes);
return String.Format("{0} minutes", minutes);
}
}
感谢Peter提供的扩展方法。我对其进行了修改,以更好地处理较长时间跨度:
namespace ExtensionMethods
{
public static class TimeSpanExtensionMethods
{
public static string ToReadableString(this TimeSpan span)
{
string formatted = string.Format("{0}{1}{2}",
(span.Days / 7) > 0 ? string.Format("{0:0} weeks, ", span.Days / 7) : string.Empty,
span.Days % 7 > 0 ? string.Format("{0:0} days, ", span.Days % 7) : string.Empty,
span.Hours > 0 ? string.Format("{0:0} hours, ", span.Hours) : string.Empty);
if (formatted.EndsWith(", ")) formatted = formatted.Substring(0, formatted.Length - 2);
return formatted;
}
}
}