7

2つのDateTimeフィールドの違いを取得し、それをTimeSpan変数に格納します。次に、次のルールでTimeSpanを四捨五入する必要があります。

TimeSpanの分が30未満の場合、Minutes and Secondsをゼロに設定する必要があります
。TimeSpanの分が30以上の場合、時間は1ずつ増加し、MinutesandSecondsはゼロに設定する必要があります。

TimeSpanも負の値になる可能性があるため、その場合は符号を保持する必要があります。

TimeSpanが負の値でなければ、要件を達成できる可能性がありますが、コードを書いたのですが、コードがよりかさばるので、その非効率性には満足していません。

より簡単で効率的な方法を教えてください。

ありがとうございます。それでは、お元気で、

これは、TimeSpanが負の値でない場合に正常に機能する私のコードです。

TimeSpan time_span = endTime.Subtract(startTime);
            TimeSpan time_span1;
            if (time_span.Minutes >= 30)
            {
                time_span1 = new TimeSpan(time_span.Hours + 1, 0, 0);
            }
            else
            {
                time_span1 = new TimeSpan(time_span.Hours, 0, 0);
            }

time_span1には結果が含まれます。

4

3 に答える 3

11

どうですか:

public static TimeSpan Round(TimeSpan input)
{
    if (input < TimeSpan.Zero)
    {
        return -Round(-input);
    }
    int hours = (int) input.TotalHours;
    if (input.Minutes >= 30)
    {
        hours++;
    }
    return TimeSpan.FromHours(hours);
}
于 2010-04-26T14:30:53.840 に答える
4

使用できます

double v = span.TotalHours;     
v = Math.Round(v, MidpointRounding.AwayFromZero);
span = TimeSpan.FromHours(v);

負の値に関するルールを正しく理解したかどうかにかかっています。

于 2010-04-26T14:31:08.357 に答える
3

TimeSpan は不変であるため、新しいものを作成する必要があります。これは、C# で拡張メソッドを使用する場合にも最適です。

public static class TimeSpanUtility
{
   public static TimeSpan Round( this TimeSpan ts )
   {
       var sign = ts < TimeSpan.Zero ? -1 : 1;
       var roundBy = Math.Abs(ts.Minutes) >= 30 ? 1 : 0;
       return TimeSpan.FromHours( ts.TotalHours + (sign * roundBy) );
   }
}

// usage would be:
var someTimeSpan = new TimeSpan( 2, 45, 15 );
var roundedTime = someTimeSpan.Round();
于 2010-04-26T14:31:28.577 に答える