PowerShell中DateTime转为String问题及日期比较修复求助
PowerShell日期类型转换问题解决
问题代码
$var = "01/01/2020" $date1 = Get-Date $date2 = Get-Date Write-Host $date1.GetType().Name Write-Host $date2.GetType().Name $dates = @( @('date1', [ref]$date1), @('date2', [ref]$date2) ) foreach($date in $dates) { $date[1].Value = Get-Date ([DateTime]::ParseExact($var, 'dd/MM/yyyy', $null)) -Format "dd/MM/yyyy" } Write-Host $date1 Write-Host $date2 Write-Host $date1.GetType().Name Write-Host $date2.GetType().Name
输出结果
DateTime DateTime 01/01/2020 01/01/2020 String String
疑问
为什么date1和date2从DateTime类型变为了String类型?如何修复该问题?后续需要比较这两个日期(需比较日期而非字符串)。
原因分析
问题出在Get-Date的-Format参数上:当使用-Format参数时,Get-Date返回的是字符串类型,而非DateTime对象。你将这个字符串赋值给了[ref]引用的变量,直接覆盖了原本的DateTime类型值,导致变量类型被修改。
修复方案
去掉-Format参数,直接使用[DateTime]::ParseExact解析得到的DateTime对象赋值即可。如果需要格式化显示日期,只在输出时处理,不要修改变量本身的类型。
修改后的代码:
$var = "01/01/2020" $date1 = Get-Date $date2 = Get-Date Write-Host $date1.GetType().Name Write-Host $date2.GetType().Name $dates = @( @('date1', [ref]$date1), @('date2', [ref]$date2) ) foreach($date in $dates) { # 直接使用ParseExact得到的DateTime对象,不使用-Format $date[1].Value = [DateTime]::ParseExact($var, 'dd/MM/yyyy', $null) } Write-Host $date1.ToString("dd/MM/yyyy") # 输出时格式化 Write-Host $date2.ToString("dd/MM/yyyy") Write-Host $date1.GetType().Name Write-Host $date2.GetType().Name # 可以正常进行日期比较 if ($date1 -eq $date2) { Write-Host "两个日期相等" }
修改后输出
DateTime DateTime 01/01/2020 01/01/2020 DateTime DateTime 两个日期相等
内容的提问来源于stack exchange,提问作者Ricola
相关产品推荐
相关产品推荐

