C# 如何将UTC日期时间转换为本地日期时间

C# 如何将UTC日期时间转换为本地日期时间,c#,linq,entity-framework,datetime,C#,Linq,Entity Framework,Datetime,我的搜索范围函数有问题,因为我们在数据库中存储UTC dateTime。例如,用户存储记录,并且它在UTC时区记录中的午夜之后,标记为ex“2015-06-23 01:05:34”。由于UTC的原因,我的搜索范围函数将获得错误的结果列表。我试图在linq中使用.ToLocalTime()将datetime转换为本地时间,但我有此错误 “LINQ to实体无法识别方法'System.DateTime' ToLocalTime()'方法,此方法无法转换为 存储表达式。” 我只是想问一下如何将utc日

我的搜索范围函数有问题,因为我们在数据库中存储UTC dateTime。例如,用户存储记录,并且它在UTC时区记录中的午夜之后,标记为ex“2015-06-23 01:05:34”。由于UTC的原因,我的搜索范围函数将获得错误的结果列表。我试图在linq中使用.ToLocalTime()将datetime转换为本地时间,但我有此错误

“LINQ to实体无法识别方法'System.DateTime' ToLocalTime()'方法,此方法无法转换为 存储表达式。”

我只是想问一下如何将utc日期时间转换为EF中的本地日期时间

  var rrnForms = (from rrn in db.RrnForms
                            where
                                (DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate) >= fromDateSearch.Date &&
                                 DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate) <= toDateSearch.Date)
                            select rrn).ToList();
var rrnForms=(来自db.rrnForms中的rrn
哪里
(DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate)>=fromDateSearch.Date&&

DbFunctions.TruncateTime(rrn.RrnVisitPhoneDate)LINQ to Entities通过将LINQ查询转换为在数据库上执行的SQL语句来工作。无法将
ToLocalTime()
方法转换为SQL语句,因此不能在LINQ to Entities查询中使用该方法


相反,您需要在将边界时间传递到LINQ语句之前将其转换为UTC,然后将结果时间从数据库转换回本地时间(如果需要)。

LINQ to Entities通过将LINQ查询转换为在数据库上执行的SQL语句来工作。
ToLocalTime()
方法无法转换为SQL语句,因此不能在LINQ to Entities查询中使用该语句

相反,在将边界时间传递到LINQ语句之前,您需要将其转换为UTC,然后将结果时间从数据库转换回本地时间(如果需要)。

我强烈建议您以另一种方式执行转换:在.NET代码中,执行转换(一次)从本地时间到UTC,确保您真正应用了正确的时区。然后您可以将UTC值传递给LINQ查询

除此之外,这意味着您要将转换应用于一对值,而不是数据库中的每一行

你需要考虑的是,由于DST转换,本地时间要么无效要么模糊不清,但这实际上是一个问题,只是通过转换明确的方式来隐藏。事实上,我想说,你最终可以更简单地理解结果。想象一下你的时区是欧洲/伦敦,这是变化的。2015年10月25日当地时间凌晨2点(UTC凌晨1点)从英国夏令时(UTC+1)到格林尼治时间(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转换为较晚的版本)。

我强烈建议您以另一种方式执行转换:在.NET代码中,执行转换(一次)从本地时间到UTC,确保您真正应用了正确的时区。然后您可以将UTC值传递给LINQ查询

除此之外,这意味着您要将转换应用于一对值,而不是数据库中的每一行

你需要考虑的是,由于DST转换,本地时间要么无效要么模糊不清,但这实际上是一个问题,只是通过转换明确的方式来隐藏。事实上,我想说,你最终可以更简单地理解结果。想象一下你的时区是欧洲/伦敦,这是变化的。2015年10月25日当地时间凌晨2点(UTC凌晨1点)从英国夏令时(UTC+1)到格林尼治时间(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转换为较晚的事件)。

您查看了它吗?您查看了它吗?