5

TimeSpansをC#で次のようにフォーマットしたいと思います。

xxx日yyy時間zzz分

条件:

  1. 余分な秒は切り捨てる必要があります

  2. 日は私が欲しい最大の単位です。34日を1か月4日ではなく34日として表示したい。

  3. 期間が1日未満の場合、その日の部分を表示したくありません。同様に、スパンが1時間未満の場合は、分部分のみを表示します。

組み込みのフォーマット文字列を使用してこれを行う方法はありますか、それとも独自の関数を作成する以外の方法はありませんか?

編集:現在、このために私自身の関数を使用しています。入力としてTimeSpanが数分かかります(TimeSpan.TotalMinutes)

private static string GetTimeStringFromMinutes(double p)
        {
            var minutes = (int) p;
            int hours = minutes / 60;
            minutes = minutes % 60;
            int days = hours/24;
            hours = hours%24;
            string dayPart = days + " day(s) ";
            string hoursPart = hours + " hour(s) ";
            string minutesPart = minutes + " minute(s)";
            if (days != 0)
                return (dayPart + hoursPart + minutesPart);
            if (hours != 0)
                return (hoursPart + minutesPart);
            return (minutesPart);
        }
4

4 に答える 4

7

TimeSpanには.NET4.0より前のフォーマットオプションはまったくありません。Ticksプロパティを使用してDateTimeに変換する必要があります。ただし、DateTime.String(format)フォーマットオプションでリモートで閉じるものはありません。自分で作成する必要があります。

.NET 4.0では、TimeSpanはToString(format)オーバーライドを取得しました。カスタムフォーマット文字列については、こちらで説明しています。3番目の要件にはコードが必要です。

于 2010-08-20T09:59:38.403 に答える
5

.NET 3.5以前では、独自の関数を作成する必要があります。

.NET 4では、フォーマットTimeSpanのサポートが追加されました。詳細については、を参照TimeSpan.ToString(string)してください。

于 2010-08-20T09:50:32.927 に答える
3

少なくとも.NET3.5では、要件を実行するための組み込みの方法はありません。これは、を拡張しTimeSpanて目的の機能を提供するクラスです。

public static class TimeSpanEx
{
    public static string FormattedString(this TimeSpan ts)
    {
        int days = (int)ts.TotalDays;
        int hrs = (int)ts.Hours;
        int mins = (int)ts.Minutes;
        StringBuilder sb = new StringBuilder();

        if (days > 0)
        {
            sb.Append(days.ToString() + (days == 1 ? " day, " : " days, "));
        }

        if (hrs > 0 || days > 0)
        {
            sb.Append(hrs.ToString() + (hrs == 1 ? " hour, " : " hours, "));
        }

        sb.Append(mins.ToString() + (mins == 1 ? " min" : " mins"));

        return sb.ToString();
    }
}
于 2010-08-20T10:32:54.123 に答える
2

残念ながら、.Netには直接利用できるものはありません。私自身、この方法で問題を解決しました。

public static class TimeSpanExtensions
{
    public static string ToDetailedString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        var sb = new StringBuilder(30);

        var current = timeSpan.ToDaysString();

        if (!String.IsNullOrEmpty(current))
            sb.Append(current);

        current = timeSpan.ToHoursString();

        if (!String.IsNullOrEmpty(current))
        {
            if (sb.Length > 0)
                sb.Append(" ");

            sb.Append(current);
        }

        current = timeSpan.ToMinutesString();

        if (!String.IsNullOrEmpty(current))
        {
            if (sb.Length > 0)
                sb.Append(" ");

            sb.Append(current);
        }

        return sb.ToString();
    }

    public static string ToDaysString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        int days = (int)timeSpan.TotalDays;

        switch (days)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 day";
            default:
                return days + " days";
        }
    }

    public static string ToHoursString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        switch (timeSpan.Hours)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 hour";
            default:
                return timeSpan.Hours + " hours";
        }
    }

    public static string ToMinutesString(this TimeSpan timeSpan)
    {
        if (timeSpan == null)
            throw new ArgumentNullException("timeSpan");

        switch (timeSpan.Minutes)
        {
            case 0:
                return String.Empty;
            case 1:
                return "1 minute";
            default:
                return timeSpan.Minutes + " minutes";
        }
    }
}

おそらくそれは最も洗練された解決策ではなく、特に機能にいくつかの改善を加えることができると思いますがToDetailedString()、それは絶対にうまく機能します。

于 2010-08-20T10:11:11.037 に答える