我正在尝试使用TimeZone在我的系统上显示本地时间。如何以最简单的方式在任何系统上以这种格式显示时间?:
时间:美国东部时间上午8:00:34
我目前正在使用以下脚本:
$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
我希望能够在不依赖简单逻辑的情况下显示时间,但能够在任何系统上提供本地时区。
答案 0 :(得分:9)
虽然这可能有点天真,但这是一种在没有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
答案 1 :(得分:6)
你应该研究DateTime
format strings。虽然我不确定他们是否可以返回时区短名称,但您可以轻松获得UTC的偏移量。
$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)
返回:
8:00:34 AM -04:00
答案 2 :(得分:3)
不愿定义另一种日期时间格式!使用现有的,例如RFC 1123。甚至还有一个PowerShell快捷方式!
Get-Date -format r
Thu,2012年6月14日16:44:18 GMT
参考: Get-Date
答案 3 :(得分:1)
我不知道任何可以为你工作的物品。您可以将逻辑包装在函数中:
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)
答案 4 :(得分:0)
我只是组合了几个脚本,最后能够在我的域控制器中运行脚本。
该脚本为域下连接的所有计算机提供时间和时区输出。 我们的应用程序服务器存在一个主要问题,并使用此脚本来交叉检查时间和时区。
# 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
答案 5 :(得分:0)
这是一个更好的答案:
$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
答案 6 :(得分:0)
俄罗斯,法国,挪威,德国:
get-date -format "HH:mm:ss ddd dd'.'MM'.'yy' г.' zzz"
俄罗斯时区的输出:22:47:27Чт21.11.19г. +03:00
其他-只需更改代码即可。