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”转换为规范函数。还有其他方法可以做到这一点吗?
更新:
另一个想法是,如果时区偏移量作为另一列存储在数据库中,是否有办法让数据库执行计算(日期+偏移量)?
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)
| 归档时间: |
|
| 查看次数: |
2008 次 |
| 最近记录: |