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

文件LastWriteTime与CreationTime不一致的技术疑问及解决思路

PowerShell中文件LastWriteTime与CreationTime看似相等却比较为False的原因及解决方法

你遇到的这个问题其实挺常见的,核心根源在于Windows文件系统里的时间戳存储了比默认显示更高的精度——具体到毫秒甚至微秒级别,而PowerShell默认输出时会把这些高精度部分隐藏起来,所以看起来两个时间完全一致,但实际底层的数值是存在细微差别的。

先看你给出的实际测试示例:

PS 09:30 C:\src\t >Get-ChildItem .\uu.txt | Select-Object -Property Name,LastWriteTime,CreationTime
Name LastWriteTime CreationTime
---- ------------- ------------
uu.txt 2019-08-09 09:23:25 2019-08-09 09:23:25
PS 09:30 C:\src\t >Get-ChildItem .\uu.txt | ForEach-Object { $_.LastWriteTime -eq $_.CreationTime }
False

这里Select-Object的输出只展示到秒,但LastWriteTime和CreationTime本质是DateTime对象,它们存储的精度远高于秒。当你用-eq直接比较这两个对象时,PowerShell会精确对比它们的完整时间值,哪怕是几微秒的差异都会让比较结果返回False。

至于你问的“是否只能通过ToString方式进行比较”——其实用ToString格式化到秒的话,确实能让字符串比较返回True,但这种方法不够严谨:如果遇到两个时间差在秒内但实际需要区分的场景,ToString会直接忽略掉这些差异。更稳妥的方式还是像你后来做的那样,判断两个时间的差值是否在可接受的范围内。

你采用的解决代码就很合理:

$CloseEnough = New-Timespan -Seconds 1
Get-ChildItem -File -Path 'C:\src\t' | Where-object { ($_.LastWriteTime - $_.CreationTime) -lt $CloseEnough }

这个逻辑允许时间戳存在细微的精度误差,只要差异在1秒内就认为符合“创建后仅写入一次”的预期,完全贴合你的需求。

如果想要直观看到这两个时间的高精度差异,可以用ToString显示完整的时间细节:

Get-ChildItem .\uu.txt | ForEach-Object {
    Write-Host "LastWriteTime: $($_.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss.fffffff'))"
    Write-Host "CreationTime: $($_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss.fffffff'))"
}

运行后你就能清楚看到两个时间在毫秒/微秒级别的不同了。

内容的提问来源于stack exchange,提问作者lit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:40:09