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

时间:2011-08-05 18:39:33

标签: c# sql-server datetime localization regional-settings

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

    P.S。 .NET 2.0& SQL Server 2005

3 个答案:

答案 0 :(得分:2)

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

对于自定义格式,您可以查看here或针对特定文化格式,您可以查看here

答案 1 :(得分:1)

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

这就是我开始调查的地方 - 摆脱数据库调用,但只记录调用Convert.ToString(serializedDateTime)Convert.ToString(new DateTime(2011, 7, 25))的结果(作为字符串表示使其显而易见的日期的示例)哪种方式是圆的东西)。如果你能得到两种不同的日期格式 - 一个用于反序列化的值,一个用于在本地创建的值。

,我真的非常感到惊讶。

反序列化后获得DateTime的“种类”(即获取Kind属性的结果)?使用该信息,您应该能够构建完全相等的DateTime值。

答案 2 :(得分:1)

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

如果是这样,那么Microsoft的these指令可能适用。