【问题标题】:Retrieve Record from Database based on Local Time根据本地时间从数据库中检索记录
【发布时间】:2014-12-02 14:07:30
【问题描述】:

假设我生活在今天日期为:2014 年 12 月 3 日的时区 在保存记录之前,我将日期保存为 UTC,所以它是 2014 年 12 月 2 日

user.Created = DateTime.UtcNow;

现在我有一个搜索页面,我想根据过滤器“今天”在该页面上检索记录。另外我想截断时间,所以我使用的是 EF 的 DbFunction。

 DateTime dateDifference = DateTime.Now.Date;
 var result= queryableData
       .Where(s => dateDifference ==
         DbFunctions.CreateDateTime(s.Created.Year, s.Created.Month,
             s.Created.Day, 0, 0, 0)).AsQueryable();

上述查询没有返回任何记录,因为存储的日期是 UTC 时间,即 2014 年 12 月 2 日,但是我生活在一个日期为 2014 年 12 月 3 日的时区。所以这是有道理的,我怎样才能修改上面的查询来满足我的要求。任何建议

【问题讨论】:

  • 数据库中的类型是什么?日期还是日期时间?
  • 数据类型为DateTime,记录值保存为UTC时间12/2/2014 1:41 PM。
  • 如果您将“今天本地”定义为午夜 + 24 小时的日期范围,那么您只需将“今天本地”翻译为“今天 UTC”并将其用作您的搜索条件。

标签: c# .net datetime


【解决方案1】:

现在我们知道该值存储为DateTime(UTC 格式),您只需要找到今天开始时的午夜 UTC 时间,以及今天结束时午夜的 UTC 时间。

如果您乐于使用系统时区,您可以使用:

DateTime today = DateTime.Today;
DateTime startUtc = today.ToUniversalTime();
DateTime endUtc = today.AddDays(1).ToUniversalTime();

var result = queryableDate.Where(s => startUtc <= s.Created &&
                                      s.Created < endUtc);

我认为您不应该需要DbFunctions 进行该查询。基本上,您根本不需要 差异 - 您只需要根据时间间隔计算出“今天”过滤器的含义,以 UTC 表示。

【讨论】:

  • 效果很好。非常感谢。但我仍然很困惑它是如何工作的。能否请您详细说明一下先生
  • @AmmarKhan:当我不知道你理解什么时,很难详细说明。例如,如果你在美国西海岸,那么“今天”(12 月 2 日)从 2014-12-02T08:00:00Z 到 2014-12-03T08:00:00Z,这就是你想要的想要查询中的过滤器来做。
【解决方案2】:

将您的本地日期转换为世界时间。

日期时间 UniversalDate = dateDifference.ToUniversalTime();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多