2014-11-24 54 views
0

我已經使用了三個文本框控件,並且在第一個文本框中指定了開始時間,在第二個文本框中我指定了結束時間,並且當控件移動到下一個文本框時,應該自動計算持續時間。我已經看到了一些使用時間跨度的建議,但它不能100%完美地工作。例如,如何計算從文本框中指定的開始和結束時間的持續時間?

如果開始時間= 10.00AM且結束時間= 03:00PM,則持續時間計算爲5小時正確,但如果開始時間= 03:00PM且結束時間= 01:00AM,則持續時間= -14:00以錯誤的方式。我期望的輸出是順時針方向= 10小時,但時間逆時針方向計算,輸出錯誤爲-14:00。如何克服這種情況。我發佈了我在下面使用的代碼。

<div> 

    <asp:Label ID="lblStartTime" runat="server" Text="StartTime"></asp:Label> 
    <asp:TextBox ID="txtstrtime" runat="server" Width="88px" AutoPostBack="True" 
    Height="25px" ontextchanged="txtstrtime_TextChanged"></asp:TextBox>   

    <asp:MaskedEditExtender ID="txtstrtime_MaskedEditExtender" runat="server" 
    TargetControlID="txtstrtime" Mask="99:99" MessageValidatorTip="true" 
    MaskType="Time" InputDirection="RightToLeft" Enabled="true" AcceptAMPM="true"> 
    </asp:MaskedEditExtender> 

    <asp:Label ID="lblEndTime" runat="server" Text="EndTime"></asp:Label> 
    <asp:TextBox ID="txtendtime" runat="server" Width="97px" Height="25px" 
    AutoPostBack="True" ontextchanged="txtendtime_TextChanged"> 
    </asp:TextBox>  

    <asp:MaskedEditExtender ID="txtendtime_MaskedEditExtender" runat="server" 
     Mask="99:99" MessageValidatorTip="true" MaskType="Time" 
    InputDirection="RightToLeft" Enabled="true" TargetControlID="txtendtime" 
    AcceptAMPM="true"> 
    </asp:MaskedEditExtender>  

    <asp:Label ID="lblduration" runat="server" Text="Duration"></asp:Label> 
    <asp:TextBox ID="txtduration" runat="server" Width="112px" Height="27px" 
    ontextchanged="txtduration_TextChanged" AutoPostBack="True"></asp:TextBox> 

    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> 
    </asp:ToolkitScriptManager> 

</div> 

和後面的代碼是

protected void txtendtime_TextChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     DateTime startTime, endTime; 
     startTime = Convert.ToDateTime(txtstrtime.Text); 
     endTime = Convert.ToDateTime(txtendtime.Text); 
     var timeDiff = new TimeSpan(endTime.Ticks - startTime.Ticks); 
     txtduration.Text = Convert.ToString(timeDiff); 
     txtduration.Focus(); 
    } 
    catch 
    { 
    } 
} 

回答

1

試試這個。

protected void txtendtime_TextChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      DateTime startTime, endTime; 
      startTime = Convert.ToDateTime(txtstrtime.Text); 
      endTime = Convert.ToDateTime(txtendtime.Text); 
      if (startTime > endTime) 
       endTime = endTime.AddDays(1); 
      TimeSpan span = (toDate - fromDate); 
      double actualHours = Math.Round(span.TotalHours, 2); 
      txtduration.Text = Convert.ToString(actualHours); 
      txtduration.Focus(); 
     } 
     catch 
     { 
     } 
    } 
+0

decimal actualHours = Math.Round(span.TotalHours,2);這條線對我不起作用。 – Ezhilan 2014-11-24 08:07:40

+0

@Ezhilan你不是在說什麼? – DevEstacion 2014-11-24 08:09:18

+0

不能隱式地將類型'double'轉換爲'decimal' – Ezhilan 2014-11-24 08:12:33

2

添加這上面txtDuration.Text:

if (timeDiff.TotalSeconds < 0) { 
     timeDiff.Add(TimeSpan.FromDays(1)); 
} 
+0

AddDays是不能接受的。消息說'System.Timespan'不包含Adddays的定義。 – Ezhilan 2014-11-24 07:52:41

+0

編輯爲實際工作的東西。抱歉。 – 2014-11-24 16:11:41

+0

沒問題,但仍然當我指定開始時間爲3.00 PM和結束時間爲01:00 AM時,我得到的輸出是-14:00小時,但我需要10:00小時。答案我已接受爲我正確工作。謝謝你的幫助。 – Ezhilan 2014-11-25 05:22:16

1

試試這個:

  DateTime startTime, endTime; 
      TimeSpan timeDiff; 
      startTime = Convert.ToDateTime(txtstrtime.Text);; 
      endTime = Convert.ToDateTime(txtendtime.Text); 
      if (startTime > endTime) 
      { 
       timeDiff = new TimeSpan(startTime.Ticks - endTime.Ticks); 
      } 
      else 
      { 
       timeDiff = new TimeSpan(endTime.Ticks - startTime.Ticks); 
      } 
      txtduration.Text = Convert.ToString(timeDiff); 
+0

我想使用我在文本框中指定的時間,而不是系統時間。 – Ezhilan 2014-11-24 08:06:42

+0

@Ezhilan現在更新 – 2014-11-24 08:08:19

+0

但現在當我指定03:00 PM和01:00 AM作爲開始和結束時間時,我得到的輸出是14:00,但我需要10:00小時。 – Ezhilan 2014-11-24 08:10:39

相關問題