DOBON.NET DOBON.NETプログラミング掲示板過去ログ

時刻表示について

環境/言語:[windows XP VS2003]
分類:[.NET]

本掲示版いつもお世話になっております。
今回もお聞きしたいことがありまして記述させて頂きます。
よろしくお願い致します。

現在フォーム上のラベルに時刻を表示するプログラムを作成しています。
実現方式としては、Timers.timerクラスを使用してintervalを1000(1秒)
としてElapsedイベントを利用してラベル上に時刻を表示しています。
実際のElapsedイベントハンドラのプログラムは以下のように記述しています。

Private Sub setTime(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
Dim d As DateTime

' 現在の時刻を取得
d = DateTime.Now

' フォーマット化して出力
Label1.Text = Format(d1, "yyyy/MM/dd HH:mm:ss")

End Sub

一見普通に時刻表示されているのですが、コントールパネルの時刻
(システム時刻)を表示し、
比較すると秒更新のずれが発生しています。
上記処理を実装すると少なくとも処理に時間がかかるので
ずれが生じているのかと認識しています。

実際システム時刻とフォーム上に表示される時刻の更新タイミング
を一致させることはできるのでしょうか?

個人的には諦めているのですが・・・

何か対応策等がありましたら教えて下さい。
よろしくお願いします。
Microsoft.Win32.SystemEvents クラスの TimeChanged イベントでどうでしょ。
まず、タイマーのIntervalを短くしてください。それでもまだダメならば、Elapsedイベントハンドラで、前回表示したときの時間を秒以上だけ覚えおき、それと今の時間とを比較することで今回表示しなおす必要があるかを調べ、必要なときだけ表示しなおすようにしてみてください。
Hongliang様、管理人様解答の方ありがとうございます。
まずHongliang様の教えて頂いたとおり、TimeChangedを利用しようとした
のですが、これはシステム時刻をユーザが変更した時に発生するイベント
ですよね??
ユーザが意図的に時刻を変更することはないので利用できないような気がしますが・・・どうでしょうか??

管理人様が教えて頂いた方法を以下のように記述してみました。
(intervalは100で設定)

Private Sub setTime(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
Static d As DateTime

If d = DateTime.Now Then
Return
End If

' 現在の時刻を取得
d = DateTime.Now

' フォーマット化して出力
Label1.Text = Format(d, "yyyy/MM/dd HH:mm:ss")

End Sub

同時刻なら表示更新しない方法で記述してみましたが、
実際のシステム時刻の更新タイミングとラベルに表示されている時刻が
一致しませんでした。

やはり実現は厳しいのでしょうか??
すいませんでした。質問内容をよく読んでいなかったようです。確かにご質問に対する回答としては無関係でした。

そもそも、「日付と時刻のプロパティ」で表示される時計自体、システム時刻と完全に一致してるわけではありません。というかかなりいい加減です。
例えば Windows XP の時計だと、「短い更新間隔」と「長い更新間隔」が存在します。長い更新間隔は数秒に 1 回存在し、短い更新間隔に比べて 1.5 倍の時間が掛かっています。
この時計と一致させるというのは難しいでしょう。
  • 題名: Re[5]: 時刻表示について
  • 著者: 太郎
  • 日時: 2008/11/08 0:27:05
  • ID: 23339
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No23326に返信(Hongliangさんの記事)
> この時計と一致させるというのは難しいでしょう。

こんなのを作ってみました。

始めに現在時刻を取得し、秒の更新があった時から
タイマーで1秒をカウントすると時刻を+1秒して
表示させます。

見た目はコントロールパネルの時計と同期していますが
何か問題はあるのでしょうか?

私の環境はVistaです。




DateTime da;

private void button1_Click(object sender, EventArgs e)
{

da = DateTime.Now;
label1.Text = da.ToString("yyyy/MM/dd HH:mm:ss");
label1.Refresh();

while (da == DateTime.Now) ;

da = DateTime.Now;
label1.Text = da.ToString("yyyy/MM/dd HH:mm:ss");

timer1.Interval = 1000;

timer1.Enabled = true;

timer1.Start();

}


private void timer1_Tick(object sender, EventArgs e)
{

da += TimeSpan.FromSeconds(1);
label1.Text = da.ToString("yyyy/MM/dd HH:mm:ss");
}

DOBON.NET | プログラミング道 | プログラミング掲示板