用途与问题
两条时间字符串一条写加八小时、一条写零偏移,看起来不同却被判定相等,可能因为它们表示同一瞬间。去重和事件排序关心时刻,保留原始显示形式关心偏移与本地字段,二者不能用同一种比较目的解释。
原理与实现选择
DateTimeOffset.Equals 比较对应的 UTC 时刻,EqualsExact 还检查偏移与日期时间表示。样本直接构造两种表示,核对普通相等、精确相等以及 UTC 值。它保存的是偏移,不包含完整时区规则或夏令时历史。
适用环境与验证范围
适用环境为 PowerShell 7。本页由 AI 辅助撰写与整理;完整受控样本已在本机 PowerShell 7.6 执行并通过检查。除文件元数据样本仅操作自行创建并清理的唯一临时文件外,其余样本只操作内存或局部会话;没有连接生产服务器或修改用户配置。已核对所引 PowerShell 与 .NET 官方资料,未在 Windows PowerShell 5.1 或目标生产环境执行,版本差异需另行验证。
可执行样本
在新的 PowerShell 7 测试会话中运行以下完整代码,保留所有检查语句。先阅读样本的文件与会话影响范围,不要在生产会话中直接替换真实输入;同名函数演示结束后退出该测试会话。
$east = [datetimeoffset]::new(2024,1,1,8,0,0,[timespan]::FromHours(8))
$utc = [datetimeoffset]::new(2024,1,1,0,0,0,[timespan]::Zero)
if (-not $east.Equals($utc)) { throw 'Same instant not recognized' }
if ($east.EqualsExact($utc)) { throw 'Different offset treated as exact' }
if ($east.UtcDateTime -ne $utc.UtcDateTime) { throw 'UTC mismatch' }
if ($east.Offset -eq $utc.Offset) { throw 'Offset distinction lost' }
'Instant equality separated from exact representation equality'预期结果与核对
两者对应同一 UTC 时刻,但偏移不同,因此精确比较不相等。输入为固定样本,不读取或更改系统时区,也不解析用户实际日志。
常见误区
相同偏移不代表属于同一时区;跨夏令时的未来日程需要时区标识及规则。字符串相等也不等同于时刻相等,解析前应先建立明确格式契约。
适用边界
适用于日志时刻比较与显示表示区分。日程规划、日期边界统计和时区转换需另行设计,不把一个固定偏移当作永久地区规则。