2016-07-26 6 views
0

私は、従業員の仕事時間を計算するためのアプリを用意しました。私は毎週の合計を表示する必要があります。これを行うために、私は毎日ループし、毎日Add()メソッドを使用します。最後に、ラベルに時間と分を書きます。タイムスパンを使用して24時間以上の間隔を追加する

foreach (DataRow day in days.Rows) 
{ 
    TimeSpan tsToAdd = new TimeSpan((int)day["hours"], (int)day["minutues"],0); 
    ts = ts.Add(tsToAdd); 
} 
label.text= ts.Hours.ToString("00") + ":" + ts.Minutes.ToString("00"); 

しかし、ts.hoursが24を超えると、0から再開します。たとえば、25時間30分は1時間30分になります。 私はTotalHourとTotalMinutesを使用しようとしますが、それは私が望むものではありません。

「30:20」などの表示方法は?

Thxを

+0

「TotalHours」の何が問題になっていますか? – CompuChip

+0

合計36時間で4日間であれば、合計時間は正確ですが、合計miutesは36時間に含まれる分を表示するので、結果は36です:((int)ts.TotalHours).ToString( "00") 2160 – Daniele

+0

'TotalHours' *と*' TotalMinutes'の両方を使用せず、 'TotalHours' *と*' Minutes'を使用してください(以下、私の回答ごとに) –

答えて

1

TimeSpanがクロック回の通常の規則内のすべての値を維持しようとする - そうHoursは常に範囲0-23である必要があり、Minutes等常に0-59でありますTimeSpanを25時間作成すると、これは1日1時間であることに気付くため、Hours1と表示され、Days1と表示されます。

TimeSpanで表される合計時間は、TotalHoursプロパティを使用して取得できます。これはfloatであり、TimeSpanにも分、秒などが含まれているため、1日1時間1分のスパンはTotalHoursの値が25.01666667です。

時間を表示するには、表示のためにTotalHoursをフォーマットするときに、その分数コンポーネントを破棄する必要があります。 Math.Floorはこれのための良い選択のように思えますが、負のタイムパンでは機能しませんので、正しい選択はMath.Truncateです。

Math.Truncate(ts.TotalHours).ToString("00") + ":" + ts.Minutes.ToString("00") 

、このような形式の文字列でToStringを使用している場合、それは同じ効果があるとして、実際に、Math.Truncate呼び出しは必要ありませんが、あなたは文字列をしたいので、提供あなたはそれを残すことができます。

+0

Thx Mattew、それが動作します!代わりに 私は考え – Daniele

+0

オム...今日私はあなたのソリューションを使用して問題を持っている:私の最後のタイムスパンが yuor sintaxを使用して TotalHours = -4.333333333333333 TotalHours = -20 であれば、最終結果は "20 -05" であります"-04:20"を期待しています – Daniele

+0

はい負の値は考慮しませんでした。 「Floor」は、厳密に下向きではなく、ゼロに向かって丸めたいので、ネガティブのために間違った方向に行きます。 'Math.Truncate'は両方を扱い、一致する解答を編集するものです。 –

1

あなたは時間の合計(端数)番号を取得するにはTotalHoursプロパティを使用することができます。

だからではなく、多分:

label.text = string.Format("{0:N2}:{1:N2}", Math.Floor(ts.TotalHours) + ":" + ts.Minutes); 
関連する問題