TimeZoneを使用してシステムの現地時間を表示しようとしています。どのようにすれば、どのフォーマットでもこのフォーマットで最も簡単な方法で時間を表示できますか?:
時間:8:00:34 AM EST
現在、次のスクリプトを使用しています。
$localtz = [System.TimeZoneInfo]::Local | Select-Object -expandproperty Id
if ($localtz -match "Eastern") {$x = " EST"}
if ($localtz -match "Pacific") {$x = " PST"}
if ($localtz -match "Central") {$x = " CST"}
"Time: " + (Get-Date).Hour + ":" + (Get-Date).Minute + ":" + (Get-Date).Second + $x
単純なロジックに依存せずに時刻を表示できるようにしたいが、任意のシステムでローカルタイムゾーンを指定できるようにしたい。
これは少し素朴ですが、おそらくナイーブですが、switchステートメントなしでanの省略形を取得する1つの方法です。
[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
私の正規表現はおそらく何かを望まないものにします。
上記の私のタイムゾーンの出力はEST
です。他のGMTオフセット設定の値を確認したいので、いくつか探しましたが、.NETにはDateTime
とTimeZoneInfo
の間に適切なリンクがありません。そのため、プログラムでそれらすべてを調べて確認するだけではありません。これは、StandardName
で返される一部の文字列では適切に機能しない可能性があります。
編集:コンピューターのタイムゾーンを手動で変更して、これとTimeZoneInfo
を確認するために、さらに調査を行いましたGMT+12
は次のようになります。
PS> [TimeZoneInfo]::Local
Id : UTC+12
DisplayName : (GMT+12:00) Coordinated Universal Time+12
StandardName : UTC+12
DaylightName : UTC+12
BaseUtcOffset : 12:00:00
SupportsDaylightSavingTime : False
これは私のコードに対してこの結果を生成します:
PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
U+12
したがって、StandardName
が単語のセットのように見えるのか、それとも標準的な名前がないので、単にオフセット指定のように見えるのかを検出する必要があると思います。
米国以外の問題の少ないものは、3ワード形式に従っているようです。
PS> [TimeZoneInfo]::Local
Id : Tokyo Standard Time
DisplayName : (GMT+09:00) Osaka, Sapporo, Tokyo
StandardName : Tokyo Standard Time
DaylightName : Tokyo Daylight Time
BaseUtcOffset : 09:00:00
SupportsDaylightSavingTime : False
PS> [Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')
TST
DateTime
format strings を調べる必要があります。タイムゾーンの短い名前を返すことができるかどうかはわかりませんが、UTCからオフセットを簡単に取得できます。
$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)
これは次を返します:
8:00:34 AM -04:00
私はあなたのために仕事をすることができるどんなオブジェクトも知りません。ロジックを関数にラップすることができます:
function Get-MyDate{
$tz = switch -regex ([System.TimeZoneInfo]::Local.Id){
Eastern {'EST'; break}
Pacific {'PST'; break}
Central {'CST'; break}
}
"Time: {0:T} $tz" -f (Get-Date)
}
Get-MyDate
または、タイムゾーンIDのイニシャルを取ることもできます。
$tz = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]})
"Time: {0:T} $tz" -f (Get-Date)
ロシア、フランス、ノルウェー、ドイツ:
get-date -format "HH:mm:ss ddd dd'.'MM'.'yy' г.' zzz"
ロシアのタイムゾーンの出力:22:47:27Чт21.11.19г. +03:00
その他-コードを変更するだけです。
いくつかのスクリプトを組み合わせるだけで、ようやくドメインコントローラーでスクリプトを実行できるようになりました。
このスクリプトは、ドメインに接続されているすべてのマシンの時間とタイムゾーンの出力を提供します。アプリケーションサーバーに大きな問題があり、このスクリプトを使用して時刻とタイムゾーンをクロスチェックしました。
# The below scripts provides the time and time zone for the connected machines in a domain
# Appends the output to a text file with the time stamp
# Checks if the Host is reachable or not via a ping command
Start-Transcript -path C:\output.txt -append
$ldapSearcher = New-Object directoryservices.directorysearcher;
$ldapSearcher.filter = "(objectclass=computer)";
$computers = $ldapSearcher.findall();
foreach ($computer in $computers)
{
$compname = $computer.properties["name"]
$ping = gwmi win32_pingstatus -f "Address = '$compname'"
$compname
if ($ping.statuscode -eq 0)
{
try
{
$ErrorActionPreference = "Stop"
Write-Host “Attempting to determine timezone information for $compname…”
$Timezone = Get-WMIObject -class Win32_TimeZone -ComputerName $compname
$remoteOSInfo = gwmi win32_OperatingSystem -computername $compname
[datetime]$remoteDateTime = $remoteOSInfo.convertToDatetime($remoteOSInfo.LocalDateTime)
if ($Timezone)
{
foreach ($item in $Timezone)
{
$TZDescription = $Timezone.Description
$TZDaylightTime = $Timezone.DaylightName
$TZStandardTime = $Timezone.StandardName
$TZStandardTime = $Timezone.StandardTime
}
Write-Host "Timezone is set to $TZDescription`nTime and Date is $remoteDateTime`n**********************`n"
}
else
{
Write-Host ("Something went wrong")
}
}
catch
{
Write-Host ("You have insufficient rights to query the computer or the RPC server is not available.")
}
finally
{
$ErrorActionPreference = "Continue"
}
}
else
{
Write-Host ("Host $compname is not reachable from ping `n")
}
}
Stop-Transcript
これはより良い答えです:
$A = Get-Date #Returns local date/time
$B = $A.ToUniversalTime() #Convert it to UTC
# Figure out your current offset from UTC
$Offset = [TimeZoneInfo]::Local | Select BaseUtcOffset
#Add the Offset
$C = $B + $Offset.BaseUtcOffset
$C.ToString()
出力:2017年3月20日午後11:55:55