web-dev-qa-db-fra.com

Afficher l'heure actuelle avec le fuseau horaire dans PowerShell

J'essaie d'afficher l'heure locale sur mon système avec le fuseau horaire. Comment puis-je afficher l'heure dans ce format de la manière la plus simple possible sur n'importe quel système ?:

Heure: 08:00:34 AM

J'utilise actuellement le script suivant:

$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

J'aimerais pouvoir afficher l'heure sans recourir à une logique simple, mais pouvoir donner le fuseau horaire local sur n'importe quel système.

10
Ken J

Bien que ce soit un peu ... naïf peut-être, c’est une façon d’obtenir une abréviation sans instruction switch:

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

Mon expression régulière laisse probablement à désirer.

La sortie de ce qui précède pour mon fuseau horaire est EST. J'en ai fait quelques recherches car je voulais voir quelle serait la valeur pour d'autres paramètres de décalage GMT, mais .NET ne semble pas avoir de très bons liens entre DateTime et TimeZoneInfo, je ne pouvais donc pas les parcourir tous par programmation pour vérifier . Cela pourrait ne pas fonctionner correctement pour certaines des chaînes qui reviennent pour StandardName.

EDIT: J'ai fait quelques recherches plus en changeant le fuseau horaire sur mon ordinateur manuellement pour vérifier ceci et un TimeZoneInfo pour GMT+12 ressemble à ceci:

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

Ce qui produit ce résultat pour mon code:

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

Donc, je suppose que vous devez déterminer si la StandardName semble être un ensemble de mots ou simplement une désignation de décalage, car il n’ya pas de nom standard pour cela.

Les moins problématiques en dehors des États-Unis semblent suivre le format de trois mots:

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
9
Shibumi

Vous devriez regarder dans DateTime format strings . Bien que je ne sois pas sûr qu'ils puissent renvoyer un nom abrégé de fuseau horaire, vous pouvez facilement obtenir un décalage par rapport à UTC.

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

Cela retourne:

8:00:34 AM -04:00
6
Robbie Rosati

Soyez réticent à définir un autre format de date et heure! Utilisez un existant, tel que RFC 1123 . Il existe même un raccourci PowerShell!

Get-Date -format r

Jeu., 14 juin 2012 16:44:18 GMT

Réf .:Get-Date

3
Colonel Panic

Je ne suis au courant d'aucun objet pouvant faire le travail à votre place. Vous pouvez envelopper la logique dans une fonction:

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

Ou même prendre les initiales de l'identifiant de fuseau horaire:

$tz = -join ([System.TimeZoneInfo]::Local.Id.Split() | Foreach-Object {$_[0]})
"Time: {0:T} $tz" -f (Get-Date)
1
Shay Levy

Je viens de combiner plusieurs scripts et j'ai finalement pu exécuter le script dans mon contrôleur de domaine.

Le script fournit la sortie de l'heure et du fuseau horaire pour toutes les machines connectées dans le domaine. Nous avons eu un problème majeur avec nos serveurs d'applications et avons utilisé ce script pour vérifier l'heure et le fuseau horaire.

# 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
0
Raghav S

C'est une meilleure réponse:

$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()

Sortie: 20/03/2017 23:55:55

0
Gavin Stevens