Linq2EF:返回具有时区偏移量的日期时间

Cod*_*rue 2 timezone datetime linq-to-sql

我们的数据库将所有时间存储为 UTC,并且我们知道用户当前的时区,因此希望返回相对于该时区的时间。因此,我们希望将偏移量合并到 LINQ 投影中,如下所示:

var users = from u in this.Context.Users
            select new UserWithCorrectedDate
            {
                Id = u.Id,
                FirstName = u.FirstName,
                LastName = u.LastName,
                RegistrationDate = u.RegistrationDate.Value.AddHours(-5)
            };
Run Code Online (Sandbox Code Playgroud)

当然,Linq2EF 无法将“ AddHours”转换为规范函数。还有其他方法可以做到这一点吗?

更新:

另一个想法是,如果时区偏移量作为另一列存储在数据库中,是否有办法让数据库执行计算(日期+偏移量)?

Jam*_*gui 5

Linq to Entities 支持 SqlFunction。如果您知道偏移小时数,您可以执行以下操作:

var users = from u in this.Context.Users
            select new UserWithCorrectedDate
            {
               Id = u.Id,
               FirstName = u.FirstName,
               LastName = u.LastName,
               RegistrationDate = SqlFunctions.DateAdd("hour", -5, u.RegistrationDate.Value)
            };
Run Code Online (Sandbox Code Playgroud)

如果您想通过使用 Timezone 函数更加精确,您可以执行以下操作(这是一个解决方法):

public static DateTime UtcToNewYorkTime(DateTime utcDateTime)
{
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

        DateTime converted = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tzi);
        return converted;
}
Run Code Online (Sandbox Code Playgroud)

然后在 POCO UserWithCorrectedDate 对象中,有一个时区日期的仅获取属性,即。

public class UserWithCorrectDate
{
    public DateTime UTCDate {get;set;}
    public DateTime NYDate
    {
         get
        {
            return Utilities.UtcToNewYorkTime(this.UTCDate);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)