トップ  >  サンプルソース  >  NTPの現在の日時取得(C#/VB.NET)

NTPの現在の日時取得(C#/VB.NET)

2012年02月13日

NTPサーバから現在の正確な日時を取得するサンプル(ソース/コード)です。

パソコンのシステム時計は正確では無い(狂う)ので、時々、NTPサーバの正確な時刻に設定(時刻合わせ)する必要があります。

NTPサーバはtime.windows.com(ポート番号:123)を使用しています。

' ----------------------------------------------------------
' NTPサーバから現在の日時を取得するサンプル(VB.NET/VS2005)
Private Sub Button1_Click( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) _
    Handles Button1.Click

    ' UDP生成
    Dim objSck As System.Net.Sockets.UdpClient
    Dim ipAny As System.Net.IPEndPoint = _
        New System.Net.IPEndPoint( _
        System.Net.IPAddress.Any, 0)
    objSck = New System.Net.Sockets.UdpClient(ipAny)

    ' UDP送信
    Dim sdat As Byte() = New Byte(47) {}
    sdat(0) = &HB
    objSck.Send(sdat, sdat.GetLength(0), _
        "time.windows.com", 123)

    ' UDP受信
    Dim rdat As Byte() = objSck.Receive(ipAny)

    ' 1900年1月1日からの経過時間(日時分秒)
    Dim lngAllS As Long ' 1900年1月1日からの経過秒数
    Dim lngD As Long    ' 日
    Dim lngH As Long    ' 時
    Dim lngM As Long    ' 分
    Dim lngS As Long    ' 秒

    ' 1900年1月1日からの経過秒数
    lngAllS = CLng( _
              rdat(40) * Math.Pow(2, (8 * 3)) + _
              rdat(41) * Math.Pow(2, (8 * 2)) + _
              rdat(42) * Math.Pow(2, (8 * 1)) + _
              rdat(43))

    lngD = lngAllS \ (24 * 60 * 60)   ' 日
    lngS = lngAllS Mod (24 * 60 * 60) ' 残りの秒数
    lngH = lngS \ (60 * 60)           ' 時
    lngS = lngS Mod (60 * 60)         ' 残りの秒数
    lngM = lngS \ 60                  ' 分
    lngS = lngS Mod 60                ' 秒

    ' DateTime型への変換
    Dim dtTime As DateTime = "1900/01/01"
    dtTime = dtTime.AddDays(lngD)
    dtTime = dtTime.AddHours(lngH)
    dtTime = dtTime.AddMinutes(lngM)
    dtTime = dtTime.AddSeconds(lngS)
    ' グリニッジ標準時から日本時間への変更
    dtTime = dtTime.AddHours(9)

    ' 現在の日時表示
    System.Diagnostics.Trace.WriteLine(dtTime)
End Sub
' ----------------------------------------------------------

// ---------------------------------------------------------
// NTPサーバから現在の日時を取得するサンプル(C#.NET/VS2005)
private void button1_Click(object sender, EventArgs e)
{
    // UDP生成
    System.Net.Sockets.UdpClient objSck;
    System.Net.IPEndPoint ipAny =
        new System.Net.IPEndPoint(
        System.Net.IPAddress.Any, 0);
    objSck = new System.Net.Sockets.UdpClient(ipAny);

    // UDP送信
    Byte[] sdat=new Byte[48];
    sdat[0] = 0xB;
    objSck.Send(sdat, sdat.GetLength(0),
        "time.windows.com", 123);

    // UDP受信
    Byte[] rdat = objSck.Receive(ref ipAny);

    // 1900年1月1日からの経過時間(日時分秒)
    long lngAllS; // 1900年1月1日からの経過秒数
    long lngD;    // 日
    long lngH;    // 時
    long lngM;    // 分
    long lngS;    // 秒

    // 1900年1月1日からの経過秒数
    lngAllS = (long)(
              rdat[40] * Math.Pow(2, (8 * 3)) +
              rdat[41] * Math.Pow(2, (8 * 2)) +
              rdat[42] * Math.Pow(2, (8 * 1)) +
              rdat[43]);

    lngD = lngAllS / (24 * 60 * 60); // 日
    lngS = lngAllS % (24 * 60 * 60); // 残りの秒数
    lngH = lngS / (60 * 60);         // 時
    lngS = lngS % (60 * 60);         // 残りの秒数
    lngM = lngS / 60;                // 分
    lngS = lngS % 60;                // 秒

    // DateTime型への変換
    DateTime dtTime = new DateTime(1900,1,1);
    dtTime = dtTime.AddDays(lngD);
    dtTime = dtTime.AddHours(lngH);
    dtTime = dtTime.AddMinutes(lngM);
    dtTime = dtTime.AddSeconds(lngS);
    // グリニッジ標準時から日本時間への変更
    dtTime = dtTime.AddHours(9);

    // 現在の日時表示
    System.Diagnostics.Trace.WriteLine(dtTime);
}
// ---------------------------------------------------------
スポンサーサイト

GoogleにURLを追加が変わった! | トップページへ戻る | Windows Update(IE9)エラー対策

このページのトップに戻る

コメント

名前
題名
メールアドレス
WEBサイト
 
コメント
パスワード
  管理者にだけ表示を許可する

このページのトップに戻る

トラックバック

このページのトップに戻る