2014-11-01 100 views
1

我在C#上的GUI上製作數字時鐘。我有5個按鈕,4個用於時區轉換,另一個用於關閉表格。C#按鈕暫停

我的問題是,當我按下按鈕一(從我的系統時間轉換中央時間),它會在標籤框中閃爍約1秒鐘的時間並恢復到我目前的系統時間。

在控制檯我知道有一個暫停執行暫停程序。如何使用暫停按住該設置上的中央時間按鈕,但保持定時器運行?我很樂意使用多種形式。

這裏是我的按鈕代碼:

private void Central_Click(object sender, EventArgs e) 
{ 
    hr = DateTime.Now.Hour; 
    hr = DateTime.Now.Hour - 1; 
    min = DateTime.Now.Minute; 
    sec = DateTime.Now.Second; 

    if (hr > 12) 
     hr -= 12; 

    if (sec % 2 == 0) 
    { 
     time.Text = hr + ":" + min + ":" + sec; 
    } 
    else 
    { 
     time.Text = hr + " " + min + " " + sec; 
    } 
} 
+0

所以你想要你的程序睡幾秒鐘來顯示你的數據,然後繼續代碼? – 2014-11-01 03:46:31

回答

0

如果我理解正確的話,也許這樣的事情會爲你工作:

private void Central_Click(object sender, EventArgs e) 
{ 
    // Here you could disable all the buttons 

    // endTime defines how long we will show this time zone (5 seconds) 
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5)); 

    while (DateTime.Now < endTime) 
    { 
     // Show the short time format (hh:mm:ss AM|PM) 
     var displayText = DateTime.Now.Subtract(TimeSpan.FromHours(1)).ToString("T"); 

     if ((DateTime.Now.Second % 2 == 1)) 
     { 
      // Every other second, hide the colons 
      displayText = displayText.Replace(":", " "); 
     } 

     time.Text = displayText; 

     // Sleep for one second 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 

    // And here you can enable the buttons again 
} 

另一個要注意的是,有建在轉換到另一個時區的方法。基本上,你得到的UTC(通用)的時間,然後將其轉換到你感興趣的時區上面的代碼可以轉換到使用這個像這樣:

private void Central_Click(object sender, EventArgs e) 
{ 
    // endTime defines how long we will show this time zone (5 seconds) 
    var endTime = DateTime.Now.Add(TimeSpan.FromSeconds(5)); 

    while (DateTime.Now < endTime) 
    { 
     // Get UTC time 
     DateTime utcTime = DateTime.UtcNow; 

     // Convert it to Central Time 
     var displayText = TimeZoneInfo.ConvertTimeFromUtc(utcTime, 
      TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")) 
      .ToString("T"); 

     if ((DateTime.Now.Second % 2 == 1)) 
     { 
      // Every other second, hide the colons 
      displayText = displayText.Replace(":", " "); 
     } 

     time.Text = displayText; 

     // Sleep for one second 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
} 
0

你的問題是相當不明確。但我想你只是簡單地製作一個定時時鐘。爲此,您需要做的是使時區設置持續。所以,你需要他們在一個類級別的變量或兩個,也許是這樣的:

TimeSpan correction = new TimeSpan(0); 
string zone = "ET"; 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    // display the corrected time with its name 
    time.Text = (DateTime.Now + correction).ToString("h:mm:ss ") + zone; 
} 

private void Central_Click(object sender, EventArgs e) 
{ 
    correction = new TimeSpan(-1, 0, 0); // set the hours of the new zone 
    zone = "CT";       // set its name 
} 

我希望你的計時器有一個更好的名字,就像你使用其他名稱。(雖然我總是包括前綴顯示我的控件的類型。)

也請看一看預定義的日期和時間格式,其中很多會根據你的機器的本地化工作的偵探:

Standard Date&Time patterns

Long time pattern

如果我不明白'暫停'是什麼意思,請澄清!如果你可能不想真的切換到一個新的時區,但只是短時間顯示它的時間,你只需要添加3或4行..:

一個新的變量來保存時間還沒有保持區域:在點擊將其設置爲幾秒鐘

int secondsToHold = 0; 

一號線,在這裏我莒南縣3秒:

secondsToHold = (int) (3 * 1000f /timer1.Interval); 

終於在Tick事件代碼來檢查並重置varaibles:

if (secondsToHold > 0) secondsToHold -= 1; 
else { correction = new TimeSpan(0); zone = "ET"; }