Powershell Отображает текущее время с часовым поясом
Я пытаюсь отображать локальное время в моей системе с помощью TimeZone. Как я могу отображать время в этом формате как можно проще в любой системе?:
Время: 8:00:34 утра EST
В настоящее время я использую следующий script:
$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
Я хотел бы показать время, не полагаясь на простую логику, но уметь дать локальный часовой пояс в любой системе. Спасибо!
Ответы
Ответ 1
Хотя это немного... наивно, возможно, это один из способов получить аббревиатуру без оператора switch:
[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
набором слов или просто обозначением смещения, потому что для него нет стандартного имени.
Менее проблематичные за пределами США, похоже, следуют трехглавому формату:
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
Ответ 2
Вы должны заглянуть в строки DateTime
. Хотя я не уверен, что они могут вернуть короткое имя часового пояса, вы можете легко получить смещение от UTC.
$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)
Это возвращает:
8:00:34 AM -04:00
Ответ 3
Не смей определять другой формат даты и времени! Используйте существующий, например rfc 1123. Там даже ярлык Powershell!
get-Date -format r
Thu, 14 Jun 2012 16:44:18 GMT
http://technet.microsoft.com/en-us/library/hh849887.aspx
Ответ 4
Я не знаю ни одного объекта, который мог бы выполнить эту работу для вас. Вы можете обернуть логику в функции:
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
Или даже взять инициалы идентификатора часового пояса:
$tz = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]})
"Time: {0:T} $tz" -f (Get-Date)
Ответ 5
Совместил несколько сценариев и, наконец, смог запустить script в моем контроллере домена. script обеспечивает вывод времени и часового пояса для всех машин, подключенных под доменом.
У нас была серьезная проблема с нашими серверами приложений, и мы использовали этот script для проверки времени и часового пояса.
#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
Ответ 6
Это лучший ответ:
$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 PM