【问题标题】:how to convert UTC dateTime to local datetime如何将 UTC 日期时间转换为本地日期时间
【发布时间】:2015-07-15 16:04:26
【问题描述】:
我的搜索范围功能有问题,因为我们将 UTC 日期时间存储在数据库中。例如,用户存储记录是在 UTC 时区记录中标记为“2015-06-23 01:05:34”的午夜之后。由于 UTC,我的搜索范围函数会得到错误的结果列表。我尝试使用 .ToLocalTime() 将日期时间转换为 linq 中的本地时间,但出现此错误
"LINQ to Entities 无法识别方法 'System.DateTime
ToLocalTime()' 方法,并且该方法不能翻译成
存储表达式。”
只是想问一下如何在EF中将utc日期时间转换为本地日期时间?
var rrnForms = (from rrn in db.RrnForms
where
(DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate) >= fromDateSearch.Date &&
DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate) <= toDateSearch.Date)
select rrn).ToList();
【问题讨论】:
标签:
c#
linq
entity-framework
datetime
【解决方案1】:
我会强烈敦促您以相反的方式执行转换:在您的 .NET 代码中,执行从本地时间到 UTC 的转换(一次),确保您真正应用正确的时区。然后您可以将 UTC 值传递给 LINQ 查询。
除此之外,这意味着您将转换应用到 一个 值对,而不是数据库中的每一行。
当然,您需要考虑由于 DST 转换而导致本地时间无效或不明确的情况 - 但这实际上是一个问题,只是通过转换明确的方式来隐藏。事实上,我会说你最终会得到更容易理解的结果。假设您的时区是欧洲/伦敦,在 2015 年 10 月 25 日当地时间凌晨 2 点(UTC 凌晨 1 点)从 BST (UTC+1) 更改为 GMT (UTC+0)。假设您有以下记录:
ID Date/Time UTC Date/Time Local (would be computed)
A 2015-10-24T23:45Z 2015-10-25T00:45 (BST)
B 2015-10-25T00:15Z 2015-10-25T01:15 (BST)
C 2015-10-25T00:45Z 2015-10-25T01:45 (BST)
D 2015-10-25T01:15Z 2015-10-25T01:15 (GMT)
E 2015-10-25T01:45Z 2015-10-25T01:45 (GMT)
F 2015-10-25T02:15Z 2015-10-25T02:15 (GMT)
请注意,它们是严格按照 UTC 升序排列的。现在假设您查询“本地日期/时间 >= 2015-01-25T01:20”。如果您执行 UTC 到本地转换,则会选择记录 C、E 和 F - 而不是 D,因为这是当地时间 01:15。我怀疑你不想要那个。我怀疑您实际上想要 C、D、E 和 F(如果您将 2015-01-25T01:20 转换为较早的事件)或只需要 E 和 F(如果您将 2015-01-25T01:20 转换为较晚的事件) .
【解决方案2】:
LINQ to Entities 通过将 LINQ 查询转换为在数据库上执行的 SQL 语句来工作。 ToLocalTime() 方法无法转换为 SQL 语句,因此您不能在 LINQ to Entities 查询中使用它。
相反,您需要将边界时间转换为 UTC,然后再将它们传递给 LINQ 语句,然后将数据库中的结果时间转换回本地时间(如果需要)。