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