2017-10-25 12 views
0

私はC#でWebフォームを構築しています。私は開始時間(開始時間、開始分、開始時間(AMまたはPM))と終了時間(3分)の3ドロップスダウンを持っています。私は正午とデバッグを選択1.ここに私のコードであるとして、値がそう。時間差が正しく計算されない

var startHourDDL = ddlStartHour.SelectedValue; 
var startMinuteDDL = ddlStartMinute.SelectedValue; 
var startTOD = ddlStartTOD.SelectedValue; 

int startHour = Convert.ToInt32(startHourDDL); 
int startMinute = Convert.ToInt32(startMinuteDDL); 

var finishHourDDL = ddlFinishHour.SelectedValue; 
var finishMinuteDDL = ddlFinishMinute.SelectedValue; 
var finishTOD = ddlFinishTOD.SelectedValue; 

int finishHour = Convert.ToInt32(finishHourDDL); 
int finishMinute = Convert.ToInt32(finishMinuteDDL); 

if (startTOD == "PM") 
{ 
    startTime = new TimeSpan(startHour + 12, startMinute, 0); 
} 

else 
{ 
    startTime = new TimeSpan(startHour, startMinute, 0); 
} 

if (finishTOD == "PM") 
{ 
    finishTime = new TimeSpan(finishHour + 12, finishMinute, 0); 
} 

else 
{ 
    finishTime = new TimeSpan(finishHour, finishMinute, 0); 
} 

TimeSpan diff = finishTime - startTime; 
string time = String.Format(diff.Hours + " Hours, " + diff.Minutes + " Minutes"); 

lblDurAmount.Text = time; 

を示し、私は開始時間のために午後2時と終了時間の午後4時を選択した場合、ラベルは2時間を示しています。私は開始時間12:00 PMと終了時刻のため午後2時を選択した場合しかし、私は-10時間を取得します。これは私が12:00 PMでデバッグするとき、私は開始時間のために得るものです

{1.00:00:00} 
ここ

私は午後5時

{17:00:00} 

を選択すると、それは私もif文

if (startHour == 12 && startTOD) 
{ 
    startTime = new TimeSpan(24, startMinute, 0); 
} 
を追加しようとした24の正午に設定されていないだろう、なぜ私が理解することはできません得るものです

しかし、それはどちらもうまくいかなかった。値はまだ1.00でした。

+2

場合
あなたがたstartTimeがfinishTime後にあるかどうかを確認する必要があり、2つの値を交換しますか? – mjwills

+1

12PMは他の文脈なしで2PM後に来るので、2PM - 12PMを引くと-10時間になります。 startTimeがfinishTimeの後にあるかどうかをチェックし、trueの場合は2つの値を入れ替える必要があります。 – Steve

+0

@mjwillis。本当の理由はありません。私はTimeSpansを扱っていたので、TimeSpansをすべて作成しました – maltman

答えて

1

TimeSpanは、1日中の時間ではなく、時間を保存するためのものです。

このように、あなたが「12PM」を保管していると考えている間は、実際に保管しているものは24時間です。 「2PM」は14時間です。

したがって、「2PM」 - 「12PM」= 14時間~24時間(すなわち、-10時間)。

この問題を解決するには、ではなく、DateTimeに日付/時刻を格納する必要があります。

+0

ああ。それは理にかなっている。だから、正午には、それを12に設定し、真夜中を24に設定できますか?それとも、長期的にはTimeSpansを捨てるほうが簡単でしょうか? – maltman

+0

基本概念を反映するデータ型を選択する方が簡単です。 「TimeSpan」は、ある時点(時間を記憶するためのもの)を記憶するためのものではない。 'DateTime'ではなく' TimeSpan'を使って動作させることができますか?確かに。理解して維持することは難しいでしょうか?絶対に。 – mjwills

+0

良い点。お手伝いありがとう。私は時間を日付に変換して、正午と深夜を別々に扱います。 – maltman

1

startTimeがfinishTimeより小さい場合にのみ操作が機能します。そうしないと、すべての結果がネガとして返されます。あなたの例では12 PMが午後2時に来るので、午後2時 - 午後12時を引いたときには-10時間になります。なぜあなたは、日付(例えば `finishTime`)を格納するために` TimeSpan`を使用している真の

if (finishTime < startTime) 
{ 
    TimeSpan swap = finishTime; 
    finishTime = startTime; 
    startTime = swap; 
} 
TimeSpan diff = finishTime - startTime; 
string time = String.Format(diff.TotalHours + " Hours, " + diff.Minutes + " Minutes"); 
+0

他の回答と同じコメントです。 if文を2つ以上設定し、正午を12に、真夜中を0に設定することはできますか? – maltman