C#を使用してラベルに現在の時刻を表示したいのですが、システム時刻が変更されると時刻は継続的に変更されます。これどうやってするの?
Timer1という新しいTimerコントロールをフォームに追加し、間隔を1000(ms)に設定してから、Timerコントロールをダブルクリックして、Timer1_Tickのコードビハインドを編集し、次のコードを追加します。
this.label1.Text = DateTime.Now.ToString();
1秒に1回(1000ミリ秒)起動するように設定された Timer
コントロールを追加します。そのタイマーの Tick
event で、現在の時刻でラベルを更新できます。
timerコントロールを追加して、10ミリ秒間隔で指定できます。
private void timer1_Tick(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString("dd-MMM-yyyy hh:mm:ss tt");
}
次のコードを試してください。
private void timer1_Tick(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString("hh:mm:ss");
}
コードまたはプロパティウィンドウのいずれかで、タイマーを有効にするように設定する必要があります。
コードで、フォームの読み込みセクションに次のように入力してください。
myTimer.Enabled = true;
myTimer.Interval = 1000;
その後、タイマーイベントが次のようになっていることを確認してください。
private void myTimer_Tick(object sender, EventArgs e)
{
timeLabel.Text = DateTime.Now.ToString("hh:mm:ss");
}
private int hr, min, sec;
public Form2()
{
InitializeComponent();
hr = DateTime.UtcNow.Hour;
min = DateTime.UtcNow.Minute;
sec = DateTime.UtcNow.Second;
}
//Time_tick click
private void timer1_Tick(object sender, EventArgs e)
{
hr = DateTime.UtcNow.Hour;
hr = hr + 5;
min = DateTime.UtcNow.Minute;
sec = DateTime.UtcNow.Second;
if (hr > 12)
hr -= 12;
if (sec % 2 == 0)
{
label1.Text = +hr + ":" + min + ":" + sec;
}
else
{
label1.Text = hr + ":" + min + ":" + sec;
}
}
タイマー間隔が正確ではないため、更新が同期していない可能性があり、実際の秒の遷移に対してドリフトします。一部のイベントでは、移行の遅れまたは前に遅れ、時間表示の更新を見逃します
この方法では、高頻度でポーリングして秒の変更時に更新を起動する代わりに、ある程度の敬意を払うことができます。
レギュレーターが好きな場合は、表示するタイムスタンプのミリ秒プロパティを使用して1000ミリ秒のタイマーを調整することにより、実際の2番目の遷移の100ミリ秒後に安全に配置されるように時間更新を調整できます。
タイマーイベントコードで、次のようにします。
//Read time
DateTime time = DateTime.Now;
//Get current ms offset from prefered readout position
int diffms = time.Millisecond-100;
//Set a new timer interval with half the error applied
timer.Interval = 1000 - diffms/2;
//Update your time output here..
次のタイマー間隔は、秒の遷移から100ミリ秒後に選択したポイントの近くでトリガーされます。 Transition + 100msの場合、エラーは+/-に切り替わり、読み出し位置を時間内に維持します。