根据当地时间从数据库中检索记录

问题描述:

假设我住在时区的今天日期是:12/3/2014 保存记录之前我用UTC保存日期,因此它将是12/2/2014根据当地时间从数据库中检索记录

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日。所以它是有道理的,我如何修改上述查询来满足我的要求。任何建议

+0

什么是数据库的类型?日期或日期时间? – 2014-12-02 14:09:22

+0

数据类型为DateTime,记录值保存为UTC 12/2/2014 1:41 PM。 – 2014-12-02 14:10:51

+0

如果定义“本地今天”作为午夜+ 24小时日期范围,那么你可以“今天UTC”翻译“本地今天”进入和使用,作为搜索条件。 – 2014-12-02 14:14:29

现在我们知道该值(在UTC),你只需要在今天开始寻找午夜UTC时间,午夜的UTC时间今天结束存储为DateTime

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

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。

+0

它很好用。非常感谢。但我仍然困惑它是如何工作的。请您详细说明一下 – 2014-12-02 14:22:35

+0

@AmmarKhan爵士:当我不明白您的理解时,很难说清楚。例如,如果你在美国西海岸,那么“今日”(12月2日)的运行时间为2014-12-02T08:00:00Z至2014-12-03T08:00:00Z,这就是你想要的希望查询中的过滤器能够完成。 – 2014-12-02 14:26:58

将您的本地日期为通用时间。

DateTime universalDate = dateDifference.ToUniversalTime();