使用其他区域性时,DateTime解析错误

本文关键字:DateTime 错误 其他 区域性 | 更新日期: 2023-09-27 18:27:14

我在多语言站点中使用EF将结果从SP映射到对象。

ctx.Database.SqlQuery<MyDTO>("MySP {0}", Id).SingleOrDefault()

我发现,当文化发生变化时,映射日期存在问题。

更具体地说,我得到的日期与16/12/2015 09:06:1512/16/2015 09:06:15相同,具体取决于用户文化。

我知道两种解决方案:

  • 获取字符串形式的日期,并使用CultureInfo.InvariantCulture进行解析
  • 在调用存储库方法之前,请将区域性切换为CultureInfo.CultureInvariant

也许还有另一种选择:

  • 我看到我们将Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture都更改为用户的区域设置,但我认为我们应该只切换UI。但我不确定如果我改变这个会打破什么

有没有其他选择,比如把文化放在EF的背景下?


更新:在执行查询之前更改Thread.CurrentThread.CurrentUICultureThread.CurrentThread.CurrentCulture似乎也没有帮助。这令人困惑。。。也许EF在更早的时候缓存了文化?

使用其他区域性时,DateTime解析错误

首先,您应该避免这样调用存储过程——这是解决OWASP Top 10 Sql Injection安全问题的一种简单方法。

相反,您应该通过将参数作为实际参数传递给存储过程来进行调用,例如:

string dateAsString = "12/16/2015 09:06:15";
string dateFormat = "MM/dd/yyyy HH:mm:ss";
DateTime theValue = DateTime.Parse(dateAsString, dateFormat, CultureInfo.InvariantCulture);
SqlParameter myDate = new SqlParameter("@theDate", theValue);
context.Database.ExecuteSqlCommand("MySP @theDate", theDate);

您可以将日期时间存储为long(teaks)或real(当您的castdatetime为real时得到的数字)。然后,您可以将这些值转换为任何文化,而不会有任何损失。

我最终找到了这个。:)

我在手表上查看DateTime的数值。这实际上就是问题所在。。。看起来手表使用了当前线程的区域性(从而将月份和日期的顺序从区域性切换到区域性)。事实证明日期是正确的(这是:如果你认为16是一个月,12/16/2015 09:06:15无论如何都不可能是一个有效的日期……永远不要太晚才意识到这一点…)

所以,VS观察者让我迷失了方向…

很高兴知道当前的线程区域性不会像我所期望的那样影响SQL数据的解析。:)

实际的错误后来出现在代码中。