2017-10-19 100 views
3

我想使用PowerShell將我的系統時間(EST)轉換爲不同的時區(GMT標準時間)。我必須通過我的RPA自動化軟件運行這個PowerShell命令,所以我打算在可能的情況下使用單個命令(而不是PS腳本)來完成此任務。這是我想使用命令:Powershell - 將本地時間轉換爲不同的時區

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

第一行只是爲了證明我想的邏輯,但我會將它作爲一個變量,讓我真正擁有隻執行一行代碼。不過,我得到以下錯誤:顯然,我不太瞭解PowerShell,有人可以幫助我使用此命令。但是,我得到以下錯誤:顯然,我不太瞭解PowerShell,有人可以幫助我使用此命令。

回答

2

試試這個,看看它是否得到你以後的東西。

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

,或者如果你喜歡第一存儲當前日期的變量(你必須在你的代碼的方式)

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

正是我在找的東西,非常感謝你! – samsingla

+0

@samsingla很高興我能幫到你。隨時接受答案作爲解決你的問題,如果它幫助你。 – notjustme

1

讓我們來看看如何診斷此。

錯誤消息:

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

是調用對象的方法當在PowerShell中常見的一種。有時這是誤導。它總是意味着給定你提供的參數,沒有任何方法的重載匹配。

另外:每種方法都有一種或多種方法可以調用它,具有不同類型的參數或不同的參數數量或順序。

在PowerShell中,您可以通過「調用」沒有圓括號或參數的方法來查看所有重載。所以:

[System.TimeZoneInfo]::ConvertTime 

結果:

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) 

在PowerShell中的錯誤信息總是引用的論據,但有時也意味着你沒有使用正確的類型

所以在你的例子中,你提供了提供了2個參數,這使得錯誤變得混亂。

但您提供的第二個參數是[string]。看看可用的重載,你可以看到沒有第二個參數需要一個字符串,他們都在尋找[System.TimeZoneInfo]類型的對象。

有時,如果存在隱式轉換,則可以使用其他類型。例如,如果某個方法採用[System.Net.IPAddress]類型的參數,則可以輸入一個字符串,如'127.0.0.1'。這是因爲[System.Net.IPAddress]知道如何將IP字符串轉換爲對象。您可以通過執行類似'127.0.0.1' -as [System.Net.IPAddress][System.Net.IPAddress]'127.0.0.1'來查看此信息。回到你的用例:似乎你不能將一個字符串轉換爲TimeZoneInfo類型,或者你的字符串不適合於此目的(即轉換失敗)。

因此,您應該首先了解如何創建或檢索代表您想要的TimeZoneInfo對象。

它在我看來就像[System.TimeZoneInfo]::GetSystemTimeZones()返回系統上所有時區的數組。

過濾該列表以找到你想要的那個似乎是個好主意。縱觀名單,我可以看到你想要使用的字符串是在StandardName財產,所以我會用這個來獲得正確的:

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

然後你就可以叫你原來的方法與對象:

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

謝謝,briantist花時間解釋。儘管我從之前的文章中獲得瞭解決方案,但您的文章幫助我瞭解了根本原因。這是非常豐富的。再次感謝! – samsingla

相關問題