繁体   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