Convert.ToString(DateTime)产生英国格式而不是美国格式

我遇到一个问题,即C#DateTime字符串无法转换为SQL DateTime,因为它被神秘地格式化为英国日期(dd / MM / yyyy)。 以下是一系列事件:

  1. 在美国的远程服务器上创建一个对象,并将其序列化为xml。
  2. xml在CA中的本地计算机上反序列化为对象。 序列化日期如下:2011-07-13T09:56:57.0542425
  3. 应用程序尝试将对象保存到调用前面提到的存储过程的数据库。 它(不必要地)将日期转换为字符串,然后使用Convert.ToString(DateTime)将其作为参数传递给sproc。
  4. sproc因SqlException“将数据类型nvarchar转换为datetime时出错”而失败,因为它为DateTime类型参数接收的字符串是dd / MM / yyyy格式(数据库语言是英语US)。

现在,代码不应该将日期时间转换为字符串,只能转换回SQL中的日期时间,但这个问题刚刚开始发生(在多台计算机上),一切都很好,超过一年。 所以我认为数据库或操作系统的文化必须刚刚改变,导致它们使用不同的日期格式。 令我惊讶的是,将操作系统(Windows 7)从英语(加拿大)更改为英语(美国)并重新启动后,问题仍然存在。 为了使其更加混乱,当在本地创建相同类型的对象而不是反序列化时,不会发生错误,无论区域设置如何。 唯一的区别是序列化版本发生在Windows服务中,本地创建的对象版本发生在Windows应用程序中。 它们都使用自己的调用Convert.ToString(DateTime)的程序集副本,但它们使用的是该程序集的相同版本。 我完全糊涂了。

PS .NET 2.0和SQL Server 2005

服务是否可能在具有错误区域设置的帐户下运行?

如果是这样,那么也许Microsoft的这些说明可能适用。

为什么不使用您特别想要的文化强制DateTime.ToString()的格式 – 或者指定与SQL函数所期望的匹配的自定义格式规则?

对于自定义格式,您可以在这里查看或文化特定格式,您可以在这里查看

我不相信DateTime除了一个简单的64位整数之外还有什么东西 – 基本上它是以刻度表示的日期/时间,以及在前几位中编码的“种类”。 因此,在本地创建新的DateTime 。 换句话说,我担心你对“在本地创建相同类型的对象”时会发生什么的说法。

这就是我开始调查的地方 – 摆脱数据库调用,但只记录调用Convert.ToString(serializedDateTime)Convert.ToString(new DateTime(2011, 7, 25)) (作为日期的一个例子Convert.ToString(new DateTime(2011, 7, 25))字符串表示使得事物明确的方式很明显。) 如果你能得到两种不同的日期格式,我会感到非常惊讶 – 一种用于反序列化的值,另一种用于本地创建的值。

反序列化后得到什么样的DateTime (即获取Kind属性的结果)? 使用该信息,您应该能够构造完全相等的DateTime值。