先日、もり(@moripro3)さんのツイートに対して下記のような返信をしたので、例として簡単なサンプル用のコードを書くことにしました。
「端末の時間いじってやるぜー👻」なんて方がいないとも限らないので、どこかのサーバーやらAPIやらから日時取得というのも面白いかもしれません😉
— きぬあさ (@kinuasa) 2019年7月21日
NICTが公開しているAPIを使って、日本標準時(NHKや時報で使われている、いわゆる日本時間)を取得するVBAマクロです。
(以前どこかで書いたような気もするのですが、見つからなかったので新しく書き直しました。)
Option Explicit Public Sub Sample() Dim dt As Date dt = GetJST() If dt = CDate(0) Then Exit Sub MsgBox "現在の時刻は [" & Format(dt, "yyyy年m月d日 h時n分s秒") & "] です。", _ vbInformation + vbSystemModal, _ "日本標準時" End Sub Private Function GetJST() As Date 'NICTのサーバーから日本標準時取得 '※同一IPからのアクセスは1秒以上の間隔を空けること ' http://www.nict.go.jp/JST/http.html Dim js As String Dim d As Object, elm As Object Dim dt As Date Const api_url As String = "https://ntp-a1.nict.go.jp/cgi-bin/json" On Error Resume Next 'エラー処理は手抜き 'JSON取得 With CreateObject("WinHttp.WinHttpRequest.5.1") .Open "GET", api_url, False .Send Select Case .Status Case 200: js = .ResponseText Case Else: GoTo Fin End Select End With 'JSONから日時取得 If Len(Trim(js)) < 1 Then GoTo Fin js = "(" & js & ")" '丸括弧で囲んでeval Set d = CreateObject("htmlfile") Set elm = d.createElement("span") elm.setAttribute "id", "result" d.body.appendChild elm d.parentWindow.execScript "document.getElementById('result').innerText = new Date(eval(" & js & ").st * 1000).toLocaleString();" If IsDate(elm.innerText) = True Then dt = CDate(elm.innerText) If Err.Number <> 0 Then GoTo Fin On Error GoTo 0 Fin: GetJST = dt End Function
仕組みは単純で、
APIからJSON取得
↓
JSONからサーバー時刻を抜き出し
↓
日付(Date)型として時刻取得
といった作業を行っています。
注意点としては、APIのガイドラインページにある通り、同一IPから連続してアクセスする場合、1秒以上の間隔を空ける必要があることです。
サーバーから日時を取得する方法としては、上記以外にも、例えば下記サイトで紹介されているような、サーバーのレスポンスヘッダー(Date)を使う方法もありますので、そのあたりはお好みで処理すれば良いかと思います。
会社でExcelタイムカードの自作を行おうと考えて色々調べていましたが、このページの標準時の記載内容はとても参考になりました。ありがとうございます。