【问题标题】: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 语句,然后将数据库中的结果时间转换回本地时间(如果需要)。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2016-07-29
      • 2019-06-21
      • 2011-06-13
      • 2018-07-15
      • 1970-01-01
      相关资源
      最近更新 更多