如何将TimeSpan转换为格式化字符串?

Mic*_*ler 102 c# timespan

我有两个DateTime变量,beginTime和endTime.通过执行以下操作,我得到了它们的不同之处:

TimeSpan dateDifference = endTime.Subtract(beginTime);
Run Code Online (Sandbox Code Playgroud)

我现在如何使用C#以hh,mm mins,ss secs格式返回一串字符串.

如果差异是00:06:32.4458750

它应该返回00小时,06分钟,32秒

Pet*_*ter 173

我刚刚构建了一些TimeSpan Extension方法.以为我可以分享:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我不想显示秒或天,该怎么办?不是'可扩展':(但它肯定是正确的方向,你应该在这里接受像"hh:mm"这样的字符串并根据它建立时间.就像`ToString()`我想@rubenroid的答案是最好的答案. (2认同)
  • @ppumkin 他的回答以完全固定的格式显示结果。此答案将处理 1 秒的合理显示,最多可达数百天。他的回答没有。 (2认同)
  • 如果您只想显示“TimeSpan”最重要的部分,例如“2天前”或“15分钟前”,请检查受@Peter anwear启发的要点:https://gist.github.com/Rychu-Pawel/ fefb89e21b764e97e4993ff517ff0129 (2认同)

vdb*_*oor 121

通过将其转换为日期时间,您可以获得本地化格式:

new DateTime(timeSpan.Ticks).ToString("HH:mm");
Run Code Online (Sandbox Code Playgroud)

  • 一定要使用"HH"而不是"hh"作为格式说明符,否则小时值0可能打印为"12" - 我猜测格式说明符的解释取决于语言环境设置. (5认同)
  • 此外,这与Guffa的问题相同 - 如果经过的时间长达26小时,则打印为"02:00"小时.但我非常喜欢这种打印格式化字符串的方式. (4认同)
  • 如果时间跨度为负,则此方法将导致问题. (4认同)

小智 94

这是最短的解决方案.

timeSpan.ToString(@"hh\:mm");
Run Code Online (Sandbox Code Playgroud)

  • @RickRatayczak Imo我不会把它称为bug,考虑到在大多数情况下,这将用于显示两个时间盘之间的经过时间.这很少超过一整天.无论如何,我明白你的观点,如果是这样的话,这个解决方案根本不适合你.我认为它很棒. (9认同)
  • 这有一个错误.timepan是1天,0小时和33分钟,它将返回00:33,即使技术上是24:33. (5认同)
  • 那是因为答案中的格式字符串没有指定要显示的时间跨度的days组件的值; 24小时翻到1天.不是一个错误,它只是没有显示. (4认同)
  • timeSpan.ToString(@ "d \:HH \:MM"); (2认同)
  • @BjarkeSøgaard我同意这不是一个错误,如果你想要显示你必须将它包含在格式字符串中的那一天,但假设两个日期时间之间的TimeSpan差异很少超过一整天的假设在哪里? (2认同)

And*_*ndy 40

TimeSpan.ToString()做的伎俩适合你?如果没有,看起来该页面上的代码示例描述了如何自定义TimeSpan对象的格式.

  • 该页面不会**描述程序员如何随意格式化TimeSpan字符串.它仅描述使用ToString()转换时返回TimeSpan的格式.ToString()不接受任何自定义参数,如"mm:ss".代码示例仅显示自动生成的字符串在给定不同TimeSpan值时的外观,**不**如何随意格式化.您需要先转换为DateTime(TimeSpan.Ticks).ToString("mm:ss"). (64认同)
  • 自.Net 4.0以来的FYI,`ToString`方法**可以**自定义格式作为参数(如`mm \\:ss`),根据此页面:http://msdn.microsoft.com/en -us /库/ dd992632.aspx (20认同)

GBe*_*gen 32

使用带有多个参数的String.Format().

using 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 8

格式化a的最简单方法TimeSpan是将其添加到a DateTime并格式化:

string formatted = (DateTime.Today + dateDifference).ToString("HH 'hrs' mm 'mins' ss 'secs'");
Run Code Online (Sandbox Code Playgroud)

只要时差不超过24小时,这就有效.

Today属性返回DateTime时间组件为零的值,因此结果的时间组件是TimeSpan值.

  • 我认为这是最简单的方法。您可能想要删除零小时和分钟,例如: .ToString("HH 'hrs' mm 'mins' ss 'secs'").Replace("00 hrs", "").Replace("00 mins", "" )。修剪() (2认同)

Gre*_*egC 8

   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);
      }
   }
Run Code Online (Sandbox Code Playgroud)


Jas*_*ter 5

根据Microsoft文档,TimeSpan结构将Hours,Minutes,Seconds和Milliseconds作为整数成员公开.也许你想要的东西:

dateDifference.Hours.ToString() + " hrs, " + dateDifference.Minutes.ToString() + " mins, " + dateDifference.Seconds.ToString() + " secs"
Run Code Online (Sandbox Code Playgroud)


DSh*_*ook 5

感谢彼得提供的扩展方法。我修改了它以更好地处理更长的时间跨度:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Edw*_*win 5

您可以使用以下代码。

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);
  }
}
Run Code Online (Sandbox Code Playgroud)