我一直在谷歌搜索一段时间,试图找到某种解决方案,但运气不佳。
我正在尝试获取一组与一天数据相对应的记录。一天的数据是4:00:00EST-3:59:59。当我向用户显示我的结果集时,我希望结果显示在用户的本地时间(在我的情况下是CST)。这通常不会那么困难,除了:
由于数据库的时间是在EST中,但记录以GMT格式保存,我不能简单地调用GETDATE()并进行调整。
值得注意的是,我在C#中使用LINQ / Entity Framework 4.1 Code-First,而我正在使用的数据库是Sybase。
那么,鉴于上述信息,对于我将数据从GMT转换为用户当地时间的可行方法是什么?
答案 0 :(得分:4)
事实证明,我过度思考了这一点,解决方案实际上非常简单。以下链接非常有用:
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);
这给了我 UTC 时间 5/10/2012 8:00:00 AM到5/11/2012 8:00:00 AM 。将其转换为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(),然后进行时区转换/其他逻辑。