【问题标题】:How to compare two DateTimeOffSet?如何比较两个 DateTimeOffSet?
【发布时间】:2014-10-29 15:40:33
【问题描述】:

我有一个 DateTimeOffSet 类型的变量。我想过滤所有在 2010 年 1 月 1 日之后创建的项目。

所以我写了以下查询:

   var _date = new DateTimeOffset(2010, 01, 01, 0, 0, 0, new TimeSpan(-7, 0, 0));

   var projects = _repository.Find<Project>
                 (x => x.CompanyId = CompId && x.CreatedOn > _date)
                .ToList();

但是当我查看数据库时,这些是我看到的值的类型:

2001-01-25 05:21:46.4370000 -08:00
2005-06-17 00:00:00.0000000 -07:00

显然,一些值具有 -08:00,而另一些值具有 -07:00。那么我的上述查询仍然相关吗?当我查看结果时,过滤正在按照我期望的方式完成。唯一关心的是那个偏移部分的含义,也许结果是偶然的。

我不太熟悉 DayeTimeOffSet 的工作方式。

【问题讨论】:

    标签: c# datetimeoffset


    【解决方案1】:

    那么我上面的查询仍然相关吗?

    是的。当您比较两个 DateTimeOffset 值时,比较的是“绝对”时间。文档根据 UtcDateTime 属性讨论了这一点。比如来自op_GreaterThan documentation

    true 如果 leftUtcDateTime 值晚于 rightUtcDateTime 值;否则,false

    只要这是您想要的行为(我想是这样),您应该没问题。 (诚​​然,我们不知道查询在哪里执行 - 如果这是 LINQ to SQL 或 EF,那么您将依赖 that 实现相同的语义,但我认为这是一个合理的期望.)

    【讨论】:

      【解决方案2】:

      DateTimeOffset 保持与 GMT 在生成值的时间和位置的偏移量。这意味着“2001-01-25 05:21:46.4370000 -08:00”记录在比格林威治标准时间晚 8 小时的位置和一年中的某个时间(相对于 DST),而“2005-06-17 00: 00:00.0000000 -07:00" 记录在一年中比格林威治标准时间晚 7 小时的位置和时间。

      但是,进行比较时会忽略时区部分。换句话说,每个日期时间都转换为 GMT / UTC 并进行比较。

      【讨论】:

      • 我认为“进行比较时忽略时区部分”有点误导,因为它们实际上用于计算 UTC。
      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2016-02-02
      • 2021-09-21
      • 2012-01-25
      • 2020-03-19
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多