Powershell отображает текущее время с часовым поясом
Я пытаюсь отобразить местное время в моей системе с часовыми поясами. Как я могу отображать время в этом формате самым простым способом в любой системе?:
время: 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
Я хотел бы иметь возможность отображать время, не полагаясь на простую логику, но иметь возможность дать локальный часовой пояс в любой системе. Спасибо!
6 ответов
пока это немного ... наивно возможно, это один из способов получить an аббревиатура без оператора switch:
[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '')
мое регулярное выражение, вероятно, оставляет желать лучшего.
выход выше для моего часового пояса EST
. Я сделал некоторые, глядя, как я хотел увидеть, какое значение будет для других настроек смещения GMT, но .NET, похоже, не имеет очень хороших связей между DateTime
и TimeZoneInfo
, поэтому я не мог просто программно запустите их все, чтобы проверить. Это может не работать для некоторых строк, которые возвращаются к StandardName
.
EDIT: я сделал еще несколько исследований, изменив часовой пояс на моем компьютере вручную, чтобы проверить это и 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*', '')
U+12
Итак, я думаю, вам придется определить, является ли StandardName
кажется, набор слов или просто смещение обозначение, потому что нет стандартного названия для него.
менее проблемные за пределами США, по-видимому, следуют формату из трех слов:
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*', '')
TST
вы должны посмотреть в DateTime
формат строки. Хотя я не уверен, что они могут вернуть короткое имя часового пояса, вы можете легко получить смещение от UTC.
$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)
возвращает:
8:00:34 AM -04:00
не хотелось бы определять другой формат datetime! Используйте существующий, например в RFC 1123. Есть даже ярлык Powershell!
get-Date -format r
чт, 14 июня 2012 16:44: 18 GMT
Я не знаю ни одного объекта, который может сделать всю работу за вас. Вы можете обернуть логику в функцию:
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)
просто объединил несколько сценариев и, наконец, смог запустить скрипт на моем контроллере домена. Скрипт обеспечивает вывод времени и часового пояса для всех машин, подключенных под доменом. У нас была серьезная проблема с нашими серверами приложений и использовали этот скрипт для перекрестной проверки времени и часового пояса.
#Below Scripts provides the Time and TimeZone 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 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 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()
выход: 3/20/2017 11:55:55 часов