LINQ 中的时区转换

本文关键字:转换 时区 LINQ | 更新日期: 2023-09-27 18:33:44

我已经在谷歌上搜索了一段时间,试图找到某种解决方案,但运气不佳。

我正在尝试获取一组对应于一天的数据的记录。一天的数据量为 4:00:00EST-3:59:59EST。当我向用户显示我的结果集时,我希望结果以用户的本地时间(在我的 CST 中(显示。这通常不会那么难,除了:

  • 我的数据库中的时间戳都是格林威治标准时间。
  • 数据库的本地时间采用 EST 为单位。
  • 我的当地时间是CST。

由于数据库的时间是 EST 但记录保存在 GMT 中,因此我不能简单地调用 GETDATE(( 并对其进行调整。

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

那么,鉴于上述信息,我将数据从 GMT 转换为用户本地时间的可靠方法是什么?

LINQ 中的时区转换

事实证明,我想得太多了,解决方案实际上非常简单。以下链接非常有帮助:

http://iamacamera.org/default.aspx?section=develop/code%20snippets&id=76http://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
                };

TimeZoneInfo.ConvertTimeFromUtc(( 可能不起作用,除非您使用 在客户端上运行查询,否则毫无价值。AsEnumerable((。我知道它绝对不适用于我们的Sybase版本。因此,我被迫尽可能多地过滤结果,调用.AsEnumerable((,然后执行时区转换/其他逻辑。