VBでインターネット上の時計(大学などのサーバー)から時刻を取得し、自分のパソコンに取得した時刻を合わせるようなプログラムを作りたいのですが。わかりやすいサイトがあったら教えてください。
SNTPサーバーからの取得であれば作成経験あります。
http://www.geocities.co.jp/SiliconValley/6876/rfc2030j.htm
に説明あります。
ありがとうございます。VBを扱うのは初めてで、同じようにSNTPをつかって時計を合わせたいとおもっています。もしよろしければ作成方法などご教授ください。
自分の質問にはレスが着かない (><)
昔のコードから必要な部分だけ抜粋しました。エラールーチンやオブジェクトの説明省きますが、こんな感じでよろしいでしょうか? 当方はVB6でWinSockコントロール使いました。
'
' 現在時間SMTPサーバーへ取得手続き
'
Private Sub cmdGetTime_Click()
'受信パケット格納変数
' 参考:SNTPのメッセージ形式はほとんど決められてしまう
' http://www.geocities.co.jp/SiliconValley/6876/rfc2030j.htm 参照(2001-12現在)
Dim bySendData(47) As Byte
'問い合わせようの最初のデータを送信
bySendData(0) = &HB
With wscSmtpSock
.Close 'エラー対策で一度閉じる
.Protocol = sckUDPProtocol 'UDPプロトコル
.RemoteHost = txtServer.Text 'NTPサーバのアドレス。
.RemotePort = 123 'NTPはUDPでポート番号123を使用する
.SendData (bySendData()) '受信要求データ送信(接続)
End With
End Sub
'
' SMTPサーバーから帰ってくる時間を取得
'
Private Sub wscSmtpSock_DataArrival(ByVal bytesTotal As Long)
Dim byGetTime() As Byte 'SMTPサーバーから受信するデータ格納変数
Dim sVal As String
Dim cuTimeStamp As Currency 'SMTPサーバーから返信されたデータの計算
'以下日付計算用変数
'算出する値に適合するのが通貨型のため、通貨型で宣言
Dim cuDays As Currency '現在の日にち格納変数
Dim cuHours As Currency '現在の時刻(何時か)の格納変数
Dim cuMinutes As Currency '現在の分の格納変数
Dim cuTempSecs As Currency '時間算出用テンポラリ変数
Dim dtTime As Date
'受信したデータを格納
wscSmtpSock.GetData byGetTime()
'世界協定時刻時間に変換する(40-43バイト目で判別する ms単位は無視)
cuTimeStamp = CCur(byGetTime(40)) * 2 ^ (8 * 3) + CCur(byGetTime(41)) * 2 ^ (8 * 2) _
+ CCur(byGetTime(42)) * 2 ^ 8 + CCur(byGetTime(43))
'NTPサーバから取得した時刻を現地時間に変換
cuTimeStamp = cuTimeStamp - 2208988800@
cuDays@ = cuTimeStamp \ (24 * CLng(60 * 60)) '日付計算(24h×60m×60s) CLngはオーバーフロー対策
cuTempSecs@ = cuTimeStamp Mod (24 * CLng(60 * 60)) '日付計算からのあまり(つまり本日分経過した秒数)
cuHours@ = cuTempSecs@ \ (60 * 60) '時間計算(60m×60s)
cuTempSecs@ = cuTempSecs@ Mod (60 * 60) '時間計算からのあまり秒(つまり残りの分数以下)
cuMinutes@ = cuTempSecs@ \ 60 '何分かの計算
cuTempSecs@ = cuTempSecs@ Mod 60 '残りが秒
'算出した結果を日付型変数に代入し、型変換する
dtTime = CDate(DateAdd("d", cuDays, "1970/01/01") & " " & cuHours & ":" & cuMinutes & ":" & cuTempSecs)
'SNTPサーバーから取り出した時間を表示
txtTime.Text = Format(dtTime, "yyyy/mm/dd hh:nn:ss")
'日本時間へ変更(グリニッジ天文台(イギリス)とは9時間の時差がある)、表示
dtTime = DateAdd("h", 9, dtTime)
txtJapan.Text = Format(dtTime, "yyyy/mm/dd hh:nn:ss")
'終了したのでソケットを閉じる。
Call wscSmtpSock.Close
ありがとうございます!!参考にさせてもらいやってみます。
わからないことがあったらまた質問しますのでお願いします。
まったりさんのコードを参考させてもらいSNTPサーバーから時刻を取得することができました。まったりさんありがとうございました。
ツイート | ![]() |