You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:20:27