2012-05-10 36 views
2

我一直在谷歌搜索一段时间,试图找到某种解决方案,但有一点运气。LINQ中的时区转换

我试图得到一组对应于一天数据量的记录。一天的数据是4:00:00EST-3:59:59EST。当我向用户显示我的结果集时,我希望结果显示在用户的当地时间(在我的情况下是CST)。这通常不会很难,除了:

  • 我的数据库中的时间戳都在GMT。
  • 数据库的本地时间在EST。
  • 我的当地时间是科技委。

由于数据库的时间在EST,但记录保存在格林威治标准时间,我不能简单地调用GETDATE()并调整它。

值得注意的是,我在C#和数据库中使用的是LINQ/Entity Framework 4.1 Code-First,它是Sybase。

那么,根据上面的信息,将数据从GMT转换为用户本地时间的方法是什么?

+3

你是指UTC?我很确定GMT有DST。 –

+0

@AustinSalonen谢谢,编辑。 – Kittoes0124

回答

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时间2012/5/10 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时间2012/5/10上午04时零零分00秒


在我的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(),然后执行时区转换/其他逻辑。

+0

我有一个类似的问题,这种类型的解决方案为我工作。谢谢。 – ozziwald

+0

好的解决方案。要小心'AsEnumerable'意味着你正在客户端做这件事。 UTC转换变得棘手,如果你想在'where或'order by'中使用它。 – nawfal