C#与整数的12小时时差

时间:2014-09-18 22:54:40

标签: c# asp.net

我有14个文本框,用户以24小时时钟格式输入两次。单击计算按钮时,计算两次之间的差值,并将十进制格式的时间返回到相应的标签。理想情况下,我希望用户只需输入一个整数时间,例如1253或925,然后从下拉框中选择AM或PM。假设用户输入1115作为选择AM的时间,然后输入300作为选择PM的输出时间(如下面的示例条目所示),单击计算按钮并在标签中返回3.75。

gui

我在下面有这个代码并且它可以工作,但是当没有正好四个字符时我会收到错误。第一个问题,如何修复此问题,如果800之类的整数将被读取为8:00而不是错误输出?

DateTime dt = DateTime.ParseExact(MondayW1InTextBox.Text, "HHmm", CultureInfo.InvariantCulture);
string timestring = dt.ToString("h:mm");
MondayW1Label.Text = timestring;

其次,一旦字符串格式化为12小时格式,我怎样才能将AM / PM下拉列表作为计算差异的参数?

下面是目前只有星期一文本框计算的C#代码,它只是24小时的时间格式,但是希望远离24小时的时间。

protected void CalculateButton_Click(object sender, EventArgs e)
    {
        TimeSpan TimeIn, TimeOut;
        if (!TimeSpan.TryParse(MondayW1InTextBox.Text, out TimeIn)) TimeIn = default(TimeSpan);
        if (!TimeSpan.TryParse(MondayW1OutTextBox.Text, out TimeOut)) TimeOut = default(TimeSpan);
        MondayW1Label.Text = (TimeOut - TimeIn).TotalHours.ToString("f2");

    }

2 个答案:

答案 0 :(得分:0)

也许这个例子(它很粗糙,但你得到了逻辑)会有所帮助:

string datetime1 = "800";
DateTime dt1 = DateTime.ParseExact((datetime1.Length == 3) ? "0" + datetime1 : datetime1, "hhmm", CultureInfo.InvariantCulture);

string dropDownVal = "AM";
if (dropDownVal == "PM")
    dt1 = dt1.AddHours (12);

string datetime2 = "1100";
DateTime dt2 = DateTime.ParseExact((datetime2.Length == 3) ? "0" + datetime2 : datetime2, "hhmm", CultureInfo.InvariantCulture);
dropDownVal = "PM";
if (dropDownVal == "PM")
    dt2 = dt2.AddHours (12);

TimeSpan TimeIn, TimeOut;
TimeIn = new TimeSpan (dt1.Ticks);
TimeOut = new TimeSpan(dt2.Ticks);

Console.WriteLine((TimeOut - TimeIn).TotalHours.ToString("f2"));
Console.ReadLine ( );

答案 1 :(得分:0)

您的第一个问题与您用于解析时间的模式有关:ParseExact将始终尝试将确切模式(在您的情况下为"HHmm")与正在解析的字符串相匹配。这意味着它需要两个数字代表小时和两位数的分钟。如果你的字符串大小为<字符串,那么你可以轻松地将前导零附加到字符串中。 4.您可以使用PadLeft方法执行此操作:

DateTime dt = DateTime.ParseExact(MondayW1InTextBox.Text.PadLeft(4, '0'), "HHmm", CultureInfo.InvariantCulture);

PadLeft的第一个参数是结果字符串的总长度(在我们的例子中是4),第二个参数是应该用来填充的字符(' 0&#39 ;)

对于第二个问题,您可以解析字符串以获取DateTime对象,如果选择了PM值,则只需将12小时添加到相应的时间。

    DateTime timeIn = DateTime.ParseExact(MondayW1InTextBox.Text.PadLeft(4, '0'), "HHmm", CultureInfo.InvariantCulture);
    DateTime timeOut = DateTime.ParseExact(MondayW1OutTextBox.Text.PadLeft(4, '0'), "HHmm", CultureInfo.InvariantCulture);

    if(dropDownListIn.SelectedValue == "PM") timeIn = timeIn.AddHours(12);
    if(dropDownListOut.SelectedValue == "PM") timeOut = timeOut.AddHours(12);

    MondayW1Label.Text = (timeOut - timeIn).TotalHours.ToString("f2");

请注意,您可以使用DateTime个对象上的减法运算符来获取它们之间的时差,而无需将它们显式转换为TimeSpans