事实证明,我对此想得太多了,解决方案实际上很简单。以下链接非常有帮助:
http://iamacamera.org/default.aspx?section=develop/code%20snippets&id=76
http://msdn.microsoft.com/en-us/library/ms973825.aspx
在查询数据库之前,我设置了以下变量:
DateTime utcBeginDateTime = DateTime.UtcNow.Date.AddHours(8);
DateTime utcEndDateTime = utcBeginDateTime.AddDays(1);
这给了我5/10/2012 8:00:00 AM 到 5/11/2012 8:00:00 AM的UTC时间。将其转换为 EST 相当简单:
TimeZoneInfo estZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcBeginDateTime, estZone);
这将给我EST时间5/10/2012 4:00:00 AM。
在我的 LINQ 查询中使用它:
var timeQuery = from p in db.cl_contact_event
where p.time_of_contact >= utcBeginDateTime && p.time_of_contact < utcEndDateTime
select new
{
time = TimeZoneInfo.ConvertTimeFromUtc(p.time_of_contact.Value, estZone),
id = p.id
};
除非您使用.AsEnumerable () 在客户端上运行查询,否则TimeZoneInfo.ConvertTimeFromUtc()可能不起作用,这毫无价值。我知道它绝对不适用于我们的 Sybase 版本。因此,我被迫尽可能多地过滤结果,调用 .AsEnumerable(),然后进行时区转换/其他逻辑。