簡體   English   中英

Powershell - 將當地時間轉換為不同的時區

[英]Powershell - convert local time to different timezone

我正在嘗試使用PowerShell將我的系統時間(EST)轉換為不同的時區(GMT標准時間)。 我必須通過我的RPA自動化軟件運行此PowerShell命令,因此我希望使用單個命令(而不是PS腳本)來完成此任務。 這是我試圖使用的命令:

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

第一行只是為了顯示我正在思考的邏輯,但我將它作為一個變量傳遞給我,所以我真的必須只執行一行代碼。 但是,我收到以下錯誤:

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

顯然,我對PowerShell了解不多,有人可以幫我解決這個問題。

試試這個,看看它是否能讓你得到你想要的東西。

[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')

我們來看看如何診斷它。

錯誤消息:

找不到“ConvertTime”和參數計數的重載:“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'來查看此[System.Net.IPAddress]'127.0.0.1'

回到你的用例:你似乎要么不能將字符串TimeZoneInfo轉換為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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM