根据文本框值(而非DateTimes)计算时间,返回四分之一小时

Time calculation from textbox values (not DateTimes), returning quarters of hour

本文关键字:返回 四分 一小时 时间 计算 而非 DateTimes 文本      更新时间:2023-09-26

我有几个问题:

-我需要使用用户输入到两个文本框中的军事时间进行计算。返回时间应为2.25小时、2.75小时等,一直到一刻钟。

-我当前计算提供的返回在提交时返回了一个格式错误。

我有一个表格,我需要计算开始时间和结束时间之间的小时差,以军事(24小时)时间输入。员工的工资以一刻钟为单位,因此回报需要以小时为单位,一直到一刻钟(即4.25小时、4.75小时等)。

由于表单的格式,开始日期和开始时间以及结束日期和结束时间位于不同的文本框中。除此之外,并非所有浏览器都支持输入type="time",因此我无法使用它来简化计算,而是使用type="number"的文本框。

相关asp如下:

<label for="tbBeginningTime">beginning time</label>
<asp:TextBox runat="server" ID="tbBeginningTime" type="number" AllowNegatives="false" onblur="javascript:hoursCalc();"></asp:TextBox>
<label for="tbEndingTime">ending time</label>
<asp:TextBox runat="server" ID="tbEndingTime" type="number" AllowNegatives="false" onblur="javascript:hoursCalc();"></asp:TextBox>
<label for="tbTotalTime">total time</label>
<asp:TextBox runat="server" ID="tbTotalTime" type="number" ReadOnly="true" AllowNegatives="false"></asp:TextBox>

我使用Javascript执行了一个简单的计算来确定小时数,但我未能成功地将小数点分隔开并计算一刻钟(.25、.50、.75)。我曾尝试将模数中的小数点分隔开来,并尝试将它们拆分成一个数组,但这些都没有在tbTotalTime文本框中提供正确的返回。

相关的javascript如下

function hoursCalc () {
        var startTime = document.getElementById('<%= tbBeginningTime.ClientID %>');
        var endTime = document.getElementById('<%= tbEndingTime.ClientID %>');
        var totalTime = document.getElementById('<%= tbTotalTime.ClientID %>');
        var t1 = 0;
        var t2 = 0;
        if (startTime.value != "") t1 = startTime.value;
        if (endTime.value != "") t2 = endTime.value;
        if (endTime.value < startTime.value) t2 = parseInt(endTime.value) + 2400;
        totalTime.value = parseInt((parseInt(t2) - parseInt(t1)) / 100);
    }

这会计算小时数并将其放入tbTotalTime文本框中,但是,当我尝试使用参数化SQL插入语句提交表单时,我收到一个错误,说明"输入字符串的格式不正确。"

这是我正在使用的c#:

protected void btnSaveClick(object sender, EventArgs e)
    {
        string connstring = ConfigurationManager.ConnectionStrings["TimeHubDBCS"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(connstring))
        {
            try
            {
                SqlCommand cmd = new SqlCommand("spInsertRequestCO", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add("@BeginningTime", SqlDbType.Time).Value = DateTime.ParseExact(tbBeginningTime.Text, "HHmm", null).TimeOfDay;
                cmd.Parameters.Add("@EndingTime", SqlDbType.Time).Value = DateTime.ParseExact(tbEndingTime.Text, "HHmm", null).TimeOfDay;
                cmd.Parameters.Add("@TotalTime", SqlDbType.Int).Value = int.Parse(tbTotalTime.Text);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                SuccessMessage = "Request Saved Successfully";
                DisplaySuccessDialog(null, null);
                ConfigureButtons(null, null);
            }
            catch (Exception ex)
            {
                PopupTitle = "Save Error: ";
                ErrorMessage = ex.Message;
                DisplayErrorDialog(null, null);
            }
        }
    }

我知道对于这样一个复杂的问题,我可能会得到一些反对票,但我不知所措。我愿意接受任何人的建议,以使这一过程更加顺利。

我收到一个错误,说明"输入字符串不正确总体安排"

出现此错误是因为您试图将某个值传递给某个方法,但传递的值与该方法所期望的值不同。

如果您在按钮点击代码中设置断点,您可以看到这一行中出现了错误。

cmd.Parameters.Add("@TotalTime", SqlDbType.Int).Value = int.Parse(tbTotalTime.Text);

您的错误具体出现在int.Parse(tbTotalTime.Text)部分。int.Parse函数需要一个可以转换为整数值的字符串(例如:"3")。但是,当您执行代码时,会得到一个空字符串,而int.Parse无法将空字符串转换为有效的数值。

即使您的javascript正在为字段设置值,它在服务器代码中也不可用。这是因为视图状态。您需要禁用此字段的视图状态,这将解决您的问题。

<asp:TextBox runat="server" ID="tbTotalTime" type="number" EnableViewState="false"
                                                    AllowNegatives="false"></asp:TextBox>

更进一步,任何时候出现错误,都要尝试在代码中设置断点并进行调试。这将帮助您了解代码的哪一部分出现故障。您可以在调试时检查变量值等。