2つのDateTime変数、beginTimeとendTimeがあります。私は次のことを行うことでそれらの違いを手に入れました。
TimeSpan dateDifference = endTime.Subtract(beginTime);
C#を使用して、hh hrs、mm mins、ss secs形式でこの文字列を返す方法を教えてください。
差が00:06:32.4458750の場合
この00時間、06分、32秒を返す必要があります
TimeSpan.ToString() はあなたのためにトリックをしますか?そうでない場合、そのページのコードサンプルはTimeSpan
オブジェクトのカスタムフォーマットを行う方法を説明しているように見えます。
いくつかの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;
}
日時に変換することにより、ローカライズされた形式を取得できます。
new DateTime(timeSpan.Ticks).ToString("HH:mm");
これが最短の解決策です。
timeSpan.ToString(@"hh\:mm");
複数のパラメーターで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);
}
}
}
TimeSpan
をフォーマットする最も簡単な方法は、それをDateTime
に追加し、以下をフォーマットすることです。
string formatted = (DateTime.Today + dateDifference).ToString("HH 'hrs' mm 'mins' ss 'secs'");
これは、時差が24時間を超えない限り機能します。
Today
プロパティは、時間コンポーネントがゼロであるDateTime
値を返すため、結果の時間コンポーネントはTimeSpan
値になります。
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);
}
}
Microsoftのドキュメント によると、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;
}
}
}
この質問は古いことは知っていますが、.Net 4では カスタムTimeSpan形式 がサポートされるようになりました。
また、私はそれが言及されていることを知っていますが、TicksをDateTimeに変換することは私を捕まえましたが、24時間以上のスパンを適切に処理しません。
new DateTime((DateTime.Now - DateTime.Now.AddHours(-25)).Ticks).ToString("HH:mm")
予想どおり25:00ではなく01:00になります。
私も同様の問題を抱えており、独自の拡張機能を思いつきましたが、他のすべてとは少し異なるようです。
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");
}
私はこれが遅い答えであることを知っていますが、これは私にとってはうまくいきます:
TimeSpan dateDifference = new TimeSpan(0,0,0, (int)endTime.Subtract(beginTime).TotalSeconds);
dateDifferenceは、1秒未満の部分を除外するようになりました。 .net 2.0でも機能します。