2014-09-18 61 views
1

我有14個文本框以24小時制格式接受用戶輸入的兩次。單擊計算按鈕時,計算兩次之間的差值,並將十進制格式的時間返回給相應的標籤。理想情況下,我希望用戶簡單地輸入時間作爲整數,例如1253或925,並從下拉框中選擇AM或PM。假設一個用戶在AM選擇時輸入1115,然後輸入300作爲PM選定的輸出時間(如下面的示例條目所示),單擊計算按鈕並在標籤中返回3.75。C#與整數12小時時差

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"); 

    } 
+0

不是你的問題,但是...你沒有考慮到DST轉換。你的計算需要一個實際的日期。 – 2014-09-19 00:26:52

+0

我住在亞利桑那州,我們不遵守夏令時。 – Highi 2014-09-19 21:36:47

+0

有趣。讓我想起那個古老的C軼事,講述一個只在星期三崩潰的節目:「char dayNames [] [9] = {」Wednesday「};'' – 2014-09-19 23:47:14

回答

0

你的第一個問題是有關您在使用解析時間模式:ParseExact會總是嘗試匹配確切的模式(在你的情況下,"HHmm")與被解析的字符串。這意味着它需要兩位數字代表分鐘的小時和兩位數字。您可以輕鬆地讓你添加一個前導零到您的字符串,只要它的大小是< 4.您可以使用PadLeft方法做它的工作:

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

PadLeft第一個參數是的總長度結果字符串(在我們的例子中是4),第二個參數是應該用來填充('0')的字符。

對於第二個問題,您可以解析字符串以獲取DateTime對象,並且如果選擇了PM值,則只需將12小時添加到相應的時間。

,你可以使用 DateTime對象減法運算符來獲得它們之間的時間差
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"); 

注意,無需顯式地將其轉換爲TimeSpans

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 ();