问题描述
任何建议将不胜感激
$Days = $expiration - $currentDate
Cannot convert value "12/28/2020" to type "system.int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $Days = $expiration - $currentDate
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [],RuntimeException
+ FullyQualifiedErrorId : InvalidCastFromStringToInteger
下面是供参考的代码段
$expiration = $QueryResults.Results.ExpiryDate_s
$expiration
12/28/2020
$currentDate = Get-Date -Format 'MM/dd/yyyy'
$currentDate
09/30/2020
$expiration.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
$currentDate.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
解决方法
您正在尝试对不正确的日期时间数据类型值进行数学运算。
我相信您可以使用New-TimeSpan
cmdlet来满足您的需求。像这样:
PS C:\WINDOWS\system32> New-TimeSpan -Start '01.01.2020' -End $(Get-Date)
Days : 274
Hours : 3
Minutes : 38
Seconds : 17
Milliseconds : 295
Ticks : 236866972950824
TotalDays : 274,151589063454
TotalHours : 6579,63813752289
TotalMinutes : 394778,288251373
TotalSeconds : 23686697,2950824
TotalMilliseconds : 23686697295,0824
您还可以调用日期时间数据类型变量的方法,例如AddDays()
。像这样:
PS C:\WINDOWS\system32> $CurrentDate = Get-Date
PS C:\WINDOWS\system32> $CurrentDate.AddDays(-274)
1 января 2020 г. 3:40:59
,
PowerShell直接支持减去[datetime]
(System.DateTime
)个实例,其结果报告为时间跨度,表示为[timespan]
(System.TimeSpan
)实例。
要使其正常工作,传递给-
(减法)运算符的 个操作数必须为[datetime]
类型,在您的情况下您只需通过 casting [1] 将您的字符串操作数设为该类型即可(而不是调用Get-Date -Format 'MM/dd/yyyy'
,而应依次调用(Get-Date).Date
直接返回[datetime]
实例):
PS> [datetime] '12/28/2020' - [datetime] '09/30/2020'
Days : 89
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 0
Ticks : 76896000000000
TotalDays : 89
TotalHours : 2136
TotalMinutes : 128160
TotalSeconds : 7689600
TotalMilliseconds : 7689600000
使用当前日期(不包含时间部分)作为RHS,仅获取两个日期之间的天数:
$days = ([datetime] '12/28/2020' - (Get-Date).Date).Days
关于您尝试过的事情:
如果将 string 类型的LHS传递给-
运算符,PowerShell会尝试将其解释为数字 。
由于不能将诸如'12/28/2020'
之类的字符串解析为数字类型,因此该操作将失败。提供一个更明显的示例:
PS> 'I am not a number' - 1
Cannot convert value "I am not a number" to type "System.Int32"
...
[int]
(System.Int32
)恰好是为错误消息选择的一种数字类型。
[1]请注意,PowerShell强制转换始终基于不变文化,后者是基于美国英语文化的,而不论当前使用哪种文化。这意味着[datetime]
强制转换接受[datetime]::Parse($string,$null)
接受的任何字符串,其中包括诸如'1/13/2020'
之类的月份优先日期字符串以及诸如'2020-1-13'
之类的模棱两可的格式。 >