[ C# / VB.NET ] システム時間の変更を検出する ( SystemEvents.TimeChanged )

Pocket

C# および VB.NET で、システム時間の変更を検出するサンプルプログラムを掲載しています。多くのアプリケーションでは取得したシステム時間を正として動作することで良いと思います。ただし、システム時間の変更によって作成されるデータは、人間目線では矛盾が起きるかもしれませんが、

  • システム目線で矛盾がないようにしておく ( システムダウンも当然避ける )
  • 変更可能なデータの規則性(時間であれば常にインクリメント)に依存しない

ように心がけたいものです。

特にサマータイムとか気にするのであれば、YYYY/MM/DD hh:mm:ss 形式で時間を保持すると後悔することになります。致命的な設計ミスです。

スポンサーリンク

システム時間の変更を検出する

システム時間の変更を検出するサンプルプログラムになります。ただし、以下のバグがあるようで、GUI からシステム時刻の変更を行った場合には、2度イベントが発生します。ただし、タイムゾーンの変更では1度のみイベントが発生します。

バグ内容 : SystemEvent.TimeChanged is fired twice

さらに、諸所の理由により修正はされないようです。すでに、2度呼ばれることを前提としたアプリが出回っているのかもしれません。庶民にはわからないことです。

バグは修正しない

バグは修正しない

VB.NET


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ' Imports Microsoft.Win32
    ' システム時間変更イベントハンラの登録
    AddHandler SystemEvents.TimeChanged, AddressOf SystemEvents_TimeChanged
End Sub

' システム時間変更イベントハンドラ
Private Sub SystemEvents_TimeChanged(ByVal sender As Object, ByVal e As EventArgs)

    ' 変更後のシステム時間を出力
    Console.WriteLine("現在時間:" & DateTime.Now.ToString())

End Sub

Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing

    ' Imports Microsoft.Win32
    ' システム時間変更イベントハンラの解除
    RemoveHandler SystemEvents.TimeChanged, New EventHandler(AddressOf SystemEvents_TimeChanged)

End Sub

C#


private void Form1_Load(object sender, EventArgs e)
{
    // using Microsoft.Win32;
    // システム時間変更時のイベントハンドラを登録
    SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
}

// システム時間変更イベントハンドラ
private void SystemEvents_TimeChanged(object sender, EventArgs e)
{
    // 変更後のシステム時間をコンソールへ出力
    Console.WriteLine("現在時間:" + DateTime.Now.ToString());
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // using Microsoft.Win32;
    // イベントハンドラを削除(削除しないとメモリリークが発生する)
    SystemEvents.TimeChanged -= new EventHandler(SystemEvents_TimeChanged);
}
バグだって直さないぜ~ワイルドだぜ~

バグだって直さないぜ~ ワイルドだぜ~

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *