Last active
April 5, 2021 06:34
-
-
Save stknohg/6b30644629f5d7169d6e to your computer and use it in GitHub Desktop.
NICTからJSONで公開されている現在時刻を取得してシステム時刻を更新するスクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.SYNOPSIS | |
NICTからJSONで公開されている現在時刻を取得してシステム時刻を更新します。 | |
.DESCRIPTION | |
NICTで公開されているJSON形式の時刻情報を取得してシステムの現在時刻を更新します。 | |
-WhatIf、-Verboseオプションをサポートしています。 | |
システム時刻を更新するには昇格している必要があります。 | |
また、時刻の取得に時間がかかりすぎた場合は処理を中断する様にしています。 | |
.PARAMETER URI | |
接続先のURI。 | |
デフォルト値は http://ntp-a1.nict.go.jp/cgi-bin/json になります。 | |
.INPUTS | |
なし | |
.OUTPUTS | |
String型 | |
処理の進行状況を出力します。 | |
.EXAMPLE | |
Update-SystemDateFromNICT | |
.EXAMPLE | |
Update-SystemDateFromNICT -URI "http://ntp-b1.nict.go.jp/cgi-bin/json" | |
.NOTES | |
.LINK | |
http://www.nict.go.jp/JST/JST.html | |
#> | |
Function Update-SystemDateFromNICT(){ | |
[CmdletBinding(SupportsShouldProcess=$true)] | |
[Outputtype([string])] | |
param( | |
[Parameter(Mandatory=$false)] | |
[string] | |
$URI = "http://ntp-a1.nict.go.jp/cgi-bin/json" | |
) | |
# | |
# NTPサーバーの時刻取得 | |
# 時刻の取得に時間がかかりすぎた場合は処理を中断する様にしています。 | |
# | |
$TIMEOUT_MSEC=5000 | |
try{ | |
$TimeSpan = Measure-Command { | |
$Result = Invoke-RestMethod -Uri $URI | |
} | |
}catch{ | |
Write-Output $_.Exception.Message | |
Write-Output "NTPサーバーの時刻取得に失敗したため処理を中断します。" | |
return | |
} | |
Write-Verbose ("Elapsed time: {0}msec" -F $TimeSpan.TotalMilliseconds) | |
if( $TimeSpan.TotalMilliseconds -gt $TIMEOUT_MSEC ){ | |
Write-Output ("NTPサーバーからの時刻取得が{0}ミリ秒以上遅延したため処理を中断します。" -F $TIMEOUT_MSEC) | |
return | |
} | |
Write-Verbose ("NTP Json value: st={0}" -F $Result.st) | |
try{ | |
$BaseNTPTicks = [Decimal]::Parse($Result.st) | |
}catch{ | |
Write-Output ("NTPサーバーから取得した時刻(st={0})が不正な値であるため処理を中断します。" -F $Result.st) | |
return | |
} | |
# | |
# NTPサーバーから取得した時刻を.NETのTicksに変換+遅延時間の調整 | |
# ※単純に処理時間 $TimeSpan の1/2を通信時間の遅延として扱っています。 | |
# | |
# NTPサーバーのst(=UnixTime)は1970/01/01 00:00:00から1秒単位のTicksです(精度は1/100秒)。 | |
# .NETのTicksは0001/01/01 00:00:00からナノ秒単位です。 | |
# | |
try{ | |
$DelayedTicks = [Int64]($TimeSpan.Ticks / 2) | |
Write-Verbose ("NTP Delayed Ticks: {0}" -F $DelayedTicks) | |
# ※ 621355968000000000 = ([DateTime]::ParseExact("1970/01/01 00:00:00", "yyyy/MM/dd HH:mm:ss", $null)).Ticks | |
$NTPTicks = [Int64]($BaseNTPTicks * 10000000) + 621355968000000000 + $DelayedTicks | |
Write-Verbose ("NTP Server ticks(Adusted): {0}" -F $NTPTicks) | |
}catch{ | |
Write-Output $_.Exception.Message | |
Write-Output "NTPサーバー時刻の変換に失敗したため処理を中断します。" | |
return | |
} | |
$NTPUtcTime = New-Object System.DateTime @($NTPTicks, [DateTimeKind]::Utc) | |
$NTPLocalTime = [TimeZoneInfo]::ConvertTimeFromUtc($NTPUtcTime, [TimeZoneInfo]::Local) | |
# | |
# システム時刻の更新 | |
# | |
$SystemLocalTime = Get-Date | |
try{ | |
Write-Output ("システム時刻を{0:yyyy/MM/dd HH:mm:ss}から{1:yyyy/MM/dd HH:mm:ss}に更新します..." -F $SystemLocalTime, $NTPLocalTime) | |
Set-Date $NTPLocalTime | Out-Null | |
Write-Output "システム時刻を更新しました。" | |
}catch{ | |
Write-Output $_.Exception.Message | |
Write-Output "システム時刻の更新に失敗しました。" | |
return | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
NICTによるHTTP/HTTPSの時刻配信は 2022年3月31日 で終了します。
以後本スクリプトは動作しませんのでご注意ください。