2017-10-19 3 views
3

J'essaie de convertir mon fuseau horaire (EST) en fuseau horaire différent (GMT Standard Time) en utilisant PowerShell. Je dois exécuter cette commande PowerShell via mon logiciel d'automatisation RPA, donc je cherche à utiliser une seule commande (au lieu du script PS) pour accomplir cette tâche si possible. Voici la commande que je suis en train d'utiliser:Powershell - convertir l'heure locale en fuseau horaire différent

$test = Get-Date 
[System.TimeZoneInfo}::ConvertTime($test, 'GMT Standard Time') 

La première ligne est juste pour montrer la logique que je pense, mais je vais le transmettre comme une variable et que je vraiment exécuter une seule ligne de code. Cependant, je reçois l'erreur suivante:

PS C:\Users\samsi> [System.TimeZoneInfo]::ConvertTime($test, 'GMT Standard Time') 
Cannot find an overload for "ConvertTime" and the argument count: "2". 
At line:1 char:1 
+ [System.TimeZoneInfo]::ConvertTime($test, 'GMT Standard Time') 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

De toute évidence, je ne sais pas beaucoup sur PowerShell, quelqu'un peut me aider s'il vous plaît avec cette commande.

Répondre

2

Essayez ceci et voyez s'il vous permet de trouver ce que vous recherchez.

[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($(Get-Date), [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time') 

ou si vous préférez stocker la date dans une première variable (la façon dont vous l'avez dans votre code)

$test = Get-Date 
[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId($test, [System.TimeZoneInfo]::Local.Id, 'GMT Standard Time') 
+1

Exactement ce que je cherchais, merci beaucoup !! – samsingla

+0

@samsingla Je suis heureux d'avoir pu aider. N'hésitez pas à accepter la réponse comme une solution à votre problème si cela vous a aidé. – notjustme

1

Regardons comment diagnostiquer cela.

Le message d'erreur:

Cannot find an overload for "ConvertTime" and the argument count: "2".

est une commune sur PowerShell pour appeler des méthodes sur les objets. Parfois, c'est trompeur. Cela signifie toujours que, compte tenu des arguments que vous avez fournis, aucune des surcharges de la méthode ne correspond. A côté: chaque méthode a une ou plusieurs façons de l'appeler, avec des paramètres de différents types, ou des nombres ou des ordres de paramètres différents.

Dans PowerShell, vous pouvez voir toutes les surcharges en "invoquant" la méthode sans parenthèses ni arguments. Alors:

[System.TimeZoneInfo]::ConvertTime 

Résultat:

OverloadDefinitions 
------------------- 
static System.DateTimeOffset ConvertTime(System.DateTimeOffset dateTimeOffset, System.TimeZoneInfo destinationTimeZone) 
static datetime ConvertTime(datetime dateTime, System.TimeZoneInfo destinationTimeZone) 
static datetime ConvertTime(datetime dateTime, System.TimeZoneInfo sourceTimeZone, System.TimeZoneInfo 
destinationTimeZone) 

Le message d'erreur dans PowerShell références toujours le nombre d'arguments, mais parfois signifie aussi que vous n'avez pas utilisé le type correct.

Donc, dans votre exemple, a fourni 2 arguments, ce qui rend l'erreur confuse.

Mais le deuxième argument que vous avez fourni est un [string]. En regardant les surcharges disponibles, vous pouvez voir qu'aucun des deuxièmes arguments ne prend une chaîne, ils recherchent tous un objet de type [System.TimeZoneInfo].

Parfois, vous pouvez utiliser un type différent, s'il existe une distribution implicite disponible. Par exemple si une méthode prend un paramètre de type [System.Net.IPAddress] alors vous pouvez donner une chaîne comme '127.0.0.1'. C'est parce que [System.Net.IPAddress] sait comment convertir une chaîne IP dans l'objet. Vous pouvez le voir en faisant quelque chose comme '127.0.0.1' -as [System.Net.IPAddress] ou [System.Net.IPAddress]'127.0.0.1'.Pour revenir à votre cas d'utilisation: il semble que vous ne pouvez pas convertir une chaîne au type TimeZoneInfo, ou que votre chaîne n'est pas valide à cette fin (c'est-à-dire que la distribution a échoué).

Vous devriez donc d'abord comprendre comment créer ou récupérer un objet TimeZoneInfo qui représente ce que vous voulez.

Il me semble que [System.TimeZoneInfo]::GetSystemTimeZones() renvoie un tableau de tous les fuseaux horaires de votre système.

Filtrer cette liste pour trouver celle que vous voulez semble être une bonne idée. En regardant la liste, je peux voir la chaîne que vous souhaitez utiliser est dans la propriété StandardName donc je vais l'utiliser pour obtenir le droit:

$gmt = [System.TimeZoneInfo]::GetSystemTimeZones().Where({$_.StandardName -eq 'GMT Standard Time'})[0] # it's an array, so get the first one 

Ensuite, vous pouvez appeler votre méthode originale avec cet objet:

[System.TimeZoneInfo]::ConvertTime($test, $gmt) 
+0

Merci, briantist d'avoir pris le temps d'expliquer. Même si j'ai reçu ma solution du post précédent, votre message m'a aidé à comprendre la cause première. C'était très instructif. Merci encore! – samsingla