在PowerShell中显示当前时间和时区

whitzsjs  于 2023-03-12  发布在  Shell
关注(0)|答案(8)|浏览(329)

我正在尝试使用时区显示系统上的本地时间。如何在任何系统上以最简单的方式显示此格式的时间?:
时间:美国东部时间上午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

我希望能够显示时间,而不依赖于简单的逻辑,但能够给予任何系统上的本地时区。

yacmzcpb

yacmzcpb1#

虽然这可能有点......幼稚,但这是一种不用switch语句就可以获得 an 缩写的方法:

[Regex]::Replace([System.TimeZoneInfo]::Local.StandardName, '([A-Z])\w+\s*', '$1')

我的正则表达式可能有些地方需要改进。
上面的输出对于我的时区是EST。我做了一些研究,因为我想看看其他GMT偏移设置的值是什么,但.NET似乎没有很好的DateTimeTimeZoneInfo之间的链接,所以我不能用编程的方式来检查它们,这可能对StandardName返回的一些字符串不起作用。

**编辑:**我做了一些进一步的调查,手动更改计算机上的时区以检查此问题,GMT+12TimeZoneInfo如下所示:

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
jhdbpxl9

jhdbpxl92#

您应该研究一下DateTime format strings,虽然我不确定它们是否能够返回时区简称,但是您可以很容易地获得UTC的偏移量。

$formatteddate = "{0:h:mm:ss tt zzz}" -f (get-date)

这将返回:

8:00:34 AM -04:00
34gzjxbg

34gzjxbg3#

不愿意定义另一种日期时间格式!使用现有的格式,如RFC 1123。甚至还有PowerShell快捷方式!

Get-Date -format r

2012年6月14日星期四格林尼治标准时间16:44:18
参考编号:* Get-Date *

carvr3hs

carvr3hs4#

这是一个更好的答案:

$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 PM

disho6za

disho6za5#

我不知道有哪个对象可以帮你完成这个工作,你可以把这个逻辑封装在一个函数中:

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)
rvpgvaaj

rvpgvaaj6#

我只是组合了几个脚本,终于能够在我的域控制器中运行脚本了。
该脚本为连接到域中的所有机器提供时间和时区的输出。我们的应用服务器出现了一个主要问题,使用该脚本交叉检查时间和时区。

# 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
23c0lvtd

23c0lvtd7#

俄罗斯、法国、挪威、德国:

get-date -format "HH:mm:ss ddd dd'.'MM'.'yy' г.' zzz"

俄罗斯时区的输出:22时47分27秒19秒21秒+03秒00秒
其他的-只要更改代码。

niwlg2el

niwlg2el8#

如果您有互联网连接... API

Function tzAbbreviation {
    Try {
        $webData = Invoke-WebRequest -Uri "https://worldtimeapi.org/api/ip" -UseBasicParsing -TimeoutSec 3 -ErrorAction Stop
        $Content = ConvertFrom-Json $webData.Content

        Return $($Content.Abbreviation)
    }
    Catch {}
}

$tzAbbreviation = tzAbbreviation

在荷兰...
输出:CET

相关问题