【问题标题】:Compare datetime without millisecond比较没有毫秒的日期时间
【发布时间】:2026-01-18 12:40:01
【问题描述】:

我需要比较两个单独列表中的日期。每个列表都由 MyFile 对象构成。这是我创建的一个类,用于获取有关文件的特定信息,例如名称、日期修改、扩展名等。唯一的问题是我的第二个列表中的很多 MyFiles 对象(从外部硬盘驱动器获取的对象)没有有日期时间戳(LastWriteTime)直到毫秒。我相信这就是我的比较不起作用的原因。例如,这是我的比较失败的示例:“为什么 c# 认为日期不相等?”

a 和 b 是 MyFile 对象,MyFile 类包含一个属性 ticks ,它等于 file.LastWriteTime.Ticks 它们没有在程序中使用,我只是将它们包含在调试目的。所以经过几次调试后,我意识到最后 7 位数字代表了一个文件的毫秒数。因此,我在 MyFile 中的 ticks 属性现在包含 11 个有效数字而不是 18 个(注释 18-11 = 7)。问题在于,当我比较刻度时,当我尝试通过除以 10000000 然后乘以 10000000 来更新刻度属性时,会得到奇怪的结果。由于我的刻度属性是一个长整数,所以当我尝试更新刻度属性时,它会丢失最后 7 位数字划分。我得到的“错误”更少。但是还有其他一些时候我会得到这样的东西:

在这里我们可以看到日期至少在第二个之前是相同的。为什么 c# 认为它不是同一个日期?我必须创建自己的“Ticks”功能吗?我知道我将 dateTime 转换为字符串然后比较它,但我想知道对象是否为 a.dateModified 比对象 b.dateModified 更新

【问题讨论】:

  • 这两个日期真的有不同的Millisecond 值吗?
  • 这是一个工作方法:*.com/questions/1004698/…通过活力检查答案

标签: c# datetime


【解决方案1】:

尝试与特定精度进行比较:

DateTime a, b;
// fill a and b with the values you need
if (Math.Abs((a-b).TotalSeconds) < 1)
    Console.WriteLine("File doesn't need to be copied");
else
    Console.WriteLine("File needs to be copied");

【讨论】:

  • 你需要截断。 TotalSeconds 可以是0.3
  • 好的,谢谢。我刚发完就查了。 TimeSpan 也可以是负数,所以我包括了Math.Abs()
  • 编辑你的答案: ------> if ((ab).TotalSeconds
  • 好吧,你需要自己决定你的精度。如果误差范围高达 1 秒,则将阈值设为 1 秒。我编辑了答案。
  • 请注意,TimeSpan 上存在 TotalSeconds。因此,上述方法可行,或者您可以使用 TimeOfDay 从 DateTime 获取 TimeSpan。