如何在 Linq 中将 DateTime 对象转换为本地/UTC 时区

本文关键字:时区 UTC 转换 对象 Linq 中将 DateTime | 更新日期: 2023-09-27 18:36:46

我想知道是否可以在 Linq 查询中转换 DateTime 对象的时区。例如

var seats = await _seat.GetAll()
                    .Where( 
                       DbFunctions.AddHours( x.StartTime, -1 ) >= x.CreationTime.ToUniversalTime());

在上面的代码中,x.StartTime 采用 UTC 时区,而 x.Creation Time 采用本地时区。 如果我在 x.CreationTime 上调用 ToUniversalTime(),我会得到一个异常。是否可以在 Linq 查询中进行转换?我知道可以在查询之前提取 CreationTime 并进行转换,但很高兴知道在 Linq quert 中转换它的可能性存在。

如何在 Linq 中将 DateTime 对象转换为本地/UTC 时区

正如@MartinLiversage列中所解释的,最佳解决方案如下:

您可以通过将所有行拉到客户端,然后使用谓词执行筛选(搁置使用"本地时间"创建的问题)来轻松解决问题。但是,我假定您要过滤数据库服务器上的记录。EF 必须将谓词转换为相应的 SQL,这限制了您可以在 Where 子句中执行的操作。DbFunctions 是一种声明某些简单计算的方法,EF 可以将这些计算转换为 SQL,但无法执行时区转换。SQL Server 没有时区的概念。

正如@Martine提到的,可以考虑以下几点:

SQL Server 2016 刚刚添加了时区支持。但是,还没有EF DbFunctions,AFAIK。不过,这里可能不是一个好的用法。