使用其他文化时,错误的DateTime解析

时间:2015-12-18 08:21:46

标签: c# .net sql-server entity-framework invariantculture

我在多语言网站中使用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在较早的时候缓解了文化?

3 个答案:

答案 0 :(得分:1)

首先,您应该避免调用这样的存储过程 - 这是解决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);

答案 1 :(得分:1)

您可以将日期时间存储为长(柚木)或实际(当您将施法日期时间变为实际时)。然后,您可以将这些值转换为任何文化而不会有任何损失。

答案 2 :(得分:0)

我最终想出了这个。 :)

我正在观看手表中DateTime s的值。这实际上是问题......看起来手表使用当前线程的文化(从而将月份和日期的顺序从文化转换为文化)。事实证明日期是正确的(如果您考虑将16作为月份,则12/16/2015 09:06:15无法成为有效日期......永远不会太晚意识到......)。

所以,VS观察者迷惑了我......

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

实际的错误是后来的代码。