Skip to content

Instantly share code, notes, and snippets.

@stknohg
Last active April 5, 2021 06:34
Show Gist options
  • Save stknohg/6b30644629f5d7169d6e to your computer and use it in GitHub Desktop.
Save stknohg/6b30644629f5d7169d6e to your computer and use it in GitHub Desktop.
NICTからJSONで公開されている現在時刻を取得してシステム時刻を更新するスクリプト
<#
.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
}
}
@stknohg
Copy link
Author

stknohg commented Apr 5, 2021

NICTによるHTTP/HTTPSの時刻配信は 2022年3月31日 で終了します。

以後本スクリプトは動作しませんのでご注意ください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment