web-dev-qa-db-ja.com

TimeSpanをフォーマットされた文字列に変換するにはどうすればよいですか?

2つのDateTime変数、beginTimeとendTimeがあります。私は次のことを行うことでそれらの違いを手に入れました。

TimeSpan dateDifference = endTime.Subtract(beginTime);

C#を使用して、hh hrs、mm mins、ss secs形式でこの文字列を返す方法を教えてください。

差が00:06:32.4458750の場合

この00時間、06分、32秒を返す必要があります

100
Michael Wheeler

TimeSpan.ToString() はあなたのためにトリックをしますか?そうでない場合、そのページのコードサンプルはTimeSpanオブジェクトのカスタムフォーマットを行う方法を説明しているように見えます。

38
Andy

いくつかの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;
}
171
Peter

日時に変換することにより、ローカライズされた形式を取得できます。

new DateTime(timeSpan.Ticks).ToString("HH:mm");
120
vdboor

これが最短の解決策です。

timeSpan.ToString(@"hh\:mm");
91
Ruberoid

複数のパラメーターで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);
        }
    }
}
32
GBegen

TimeSpanをフォーマットする最も簡単な方法は、それをDateTimeに追加し、以下をフォーマットすることです。

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

これは、時差が24時間を超えない限り機能します。

Todayプロパティは、時間コンポーネントがゼロであるDateTime値を返すため、結果の時間コンポーネントはTimeSpan値になります。

8
Guffa
   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);
      }
   }
8
GregC

Microsoftのドキュメント によると、TimeSpan構造体は、時間、分、秒、ミリ秒を整数メンバーとして公開します。たぶんあなたは次のようなものが欲しい:

dateDifference.Hours.ToString() + " hrs, " + dateDifference.Minutes.ToString() + " mins, " + dateDifference.Seconds.ToString() + " secs"
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);
  }
}
5
Edwin

拡張メソッドについて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;
        }
    }
}
4
DShook

この質問は古いことは知っていますが、.Net 4では カスタムTimeSpan形式 がサポートされるようになりました。

また、私はそれが言及されていることを知っていますが、TicksをDateTimeに変換することは私を捕まえましたが、24時間以上のスパンを適切に処理しません。

new DateTime((DateTime.Now - DateTime.Now.AddHours(-25)).Ticks).ToString("HH:mm")

予想どおり25:00ではなく01:00になります。

3
Jeff

私も同様の問題を抱えており、独自の拡張機能を思いつきましたが、他のすべてとは少し異なるようです。

    public static string TimeSpanToString(this TimeSpan timeSpan)
    {
        //if it's negative
        if (timeSpan.Ticks < 0)
        {
            timeSpan = timeSpan - timeSpan - timeSpan;
            if (timeSpan.Days != 0)
                return string.Format("-{0}:{1}", timeSpan.Days.ToString("d"), new DateTime(timeSpan.Ticks).ToString("HH:mm:ss"));
            else
                return new DateTime(timeSpan.Ticks).ToString("-HH:mm:ss");
        }

        //if it has days
        else if (timeSpan.Days != 0)
            return string.Format("{0}:{1}", timeSpan.Days.ToString("d"), new DateTime(timeSpan.Ticks).ToString("HH:mm:ss"));

        //otherwise return the time
        else
            return new DateTime(timeSpan.Ticks).ToString("HH:mm:ss");
    }
2
bizah

私はこれが遅い答えであることを知っていますが、これは私にとってはうまくいきます:

TimeSpan dateDifference = new TimeSpan(0,0,0, (int)endTime.Subtract(beginTime).TotalSeconds); 

dateDifferenceは、1秒未満の部分を除外するようになりました。 .net 2.0でも機能します。

0
Kell