Home > Windows にまつわる e.t.c.

現在の正確なローカル時刻を PowerShell で取得する


コンピューターの内部時計は、何もしないと平気で狂ってきます。

この時刻の狂いを修正するのが NTP を使った時刻同期ですが、NTP と時刻同期しておらず、内部時計の時刻が信用できない環境で正確な現在時刻を取得するのは意外と厄介です。

単純に考えれば NTP Server から独自に時刻をもらってきて、そいつを使って現在時刻を割り出せば良いのですが、NTP プロトコルそのものを実装しなければならないのでこれも大変です。

簡単に実装する方法は無いかと調べていたら、NICT が Web API で現在時刻を取得するサービスを提供しているのを見つけました。

NICT の Web API は、NTP と同様に UTC 時刻を提供してくれるので、タイムゾーンに合わせて時刻補正すれば正確な現在時刻が算出できます。

嬉しいことに PowerShell の Get-TimeZone コマンドレットがタイムゾーンのオフセット時間を提供してくれるので、この2つを組み合わせると簡単に正確な現在時刻を得ることができるのです。
(サマータイム考慮のため、オフセット算出基準日時用にベースオフセット時間を渡しているので少し複雑になっちゃいましたけど)

関数にするとこんな感じです。

##################################################################
# 現在時刻を取得する
##################################################################
function GetLocalTime($TimeID = $null){
    if((Get-Command Get-TimeZone -ErrorAction SilentlyContinue) -ne $null){
        if($TimeID -eq $null){
            $TimeZone = Get-TimeZone
        }
        else{
            $TimeZone = Get-TimeZone -Id $TimeID -ErrorAction SilentlyContinue
        }
        if( $TimeZone -eq $null ){
            return $null
        }

        $NictUri = "https://ntp-a1.nict.go.jp/cgi-bin/json"
        $UtcUnixTime = [datetime]"1970/01/01"

        $BaseUtcOffset = $TimeZone.BaseUtcOffset.Hours
        $BaseUtcOffsetUnixTime = $UtcUnixTime.AddHours($BaseUtcOffset)
        $BaseUtcOffsetTime = $BaseUtcOffsetUnixTime.AddSeconds((Invoke-RestMethod -Uri $NictUri).st)

        $LocalTimeOffset = ($TimeZone.GetUtcOffset($BaseUtcOffsetTime)).Hours
        $LocalUnixTime = $UtcUnixTime.AddHours($LocalTimeOffset)
        $LocalTime = $LocalUnixTime.AddSeconds((Invoke-RestMethod -Uri $NictUri).st)
        return $LocalTime
    }
    else{
        return $null
    }
}

Get-TimeZone がサポートされていない環境の場合は、Null を返すようにしました。
ついでに、タイムゾーン ID を渡すと、そのタイムゾーンの現在時刻を返すようにしてみました。

タイムゾーン ID は「 Get-TimeZone -Name * 」で確認できます。

 

僕は以下のタイムゾーン ID を良く使います。

太平洋標準時 : Pacific Standard Time
協定世界時 : UTC
日本 : Tokyo Standard Time

 

参考情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

NTP 同期状態ロギング
http://www.vwnet.jp/Windows/PowerShell/2018071601/NTPSyncLog.htm

現在時刻を NICT の Web API / NTP で合わせる
http://www.vwnet.jp/Windows/PowerShell/AdjustTime.htm

ドメインの時刻をNICTのNTPと同期させる
http://www.vwnet.jp/Windows/WS08R2/NTP/w32time.html

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.