2017-10-25 10 views
0

C#에서 웹 양식을 작성 중입니다. 시작 시간 (시작 시간, 시작 분, 시작 시간 (AM 또는 PM)) 및 종료 시간 (종료 시간)은 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:00 시부 터 종료 시간 4:00 오후 선택하면, 라벨 2 시간을 보여줍니다. 내가 시작 시간 12:00 시부 터 종료 시간 2:00 오후 선택하는 경우 그러나, 나는 -10 시간을 얻는다. 이것은 내가 12:00 PM에 디버깅 할 때 내가 시작 시간을 위해 무엇을 얻을

.

{1.00:00:00} 
여기

내가 오후 5:00

{17:00:00} 

내가 문 만약 내가 심지어 추가 시도 (24)에 왜가 설정되지 않습니다 정오를 알아낼 수 없습니다 선택할 때 무엇을 얻을

if (startHour == 12 && startTOD) 
{ 
    startTime = new TimeSpan(24, startMinute, 0); 
} 

하지만 그 중 하나가 작동하지 않았다. 가치는 여전히 1.00입니다.

+2

경우
당신은 startTime을이 finishTime 후 있는지 확인해야하고 두 값을 교환? – mjwills

+1

12PM은 다른 문맥없이 2PM 이후에 나오므로 2PM - 12PM을 뺄 때 -10 시간을 얻습니다. startTime이 finishTime 뒤에 있는지 확인하고 true이면 두 값을 스와핑해야합니다. – Steve

+0

@mjwillis. 진짜 이유가 없어. 나는 TimeSpans를 다루므로 모든 TimeSpans를 만들었습니다. – maltman

답변

1

TimeSpan은 낮 시간이 아니라 시간을 저장하기위한 것입니다.

마찬가지로 "12PM"을 저장한다고 생각하는 동안 실제로 저장하는 것은 24 시간입니다. "2PM"은 14 시간입니다.

따라서 "2PM"- "12PM"= 14 시간 - 24 시간 (즉, -10 시간).

이 문제를 해결하려면 TimeSpan이 아닌 DateTime에 날짜/시간을 저장해야합니다.

+0

아 좋아요. 그건 의미가 있습니다. 그럼 정오가되면 12시에 자정을 24로 설정해 주시겠습니까? 아니면 장기적으로 TimeSpans를 버리는 것이 더 쉬울까요? – maltman

+0

기본 개념을 반영하는 데이터 유형을 선택하는 것이 더 쉬울 것입니다. 'TimeSpan'은 특정 시점을 저장하는 것이 아닙니다 (저장 기간). 'TimeTime'보다는'TimeSpan'을 사용하여 작동하게 할 수 있습니까? 확실한. 이해하고 유지하기가 어려울까요? 명확히. – mjwills

+0

좋은 지적. 도와 주셔서 감사합니다. 내 시간을 날짜로 변환 한 다음 정오와 자정을 따로 처리합니다. – maltman

1

startTime이 finishTime보다 작은 경우에만 작업이 작동하며, 그렇지 않으면 모든 결과가 다시 음수로 표시됩니다. 귀하의 예에서는 오후 12 시가 오후 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