在不同服务器上服务器的全局区域性不同时的DateTime问题

时间:2011-10-24 11:23:36

标签: c# asp.net sql datetime-format

我的网站托管在不同位置的多台服务器上

数据格式的文化不同 - 我们在每个地方都使用mm/dd/yyyy格式,但是如果某个服务器的文化设置为dd/mm/yyyy,那么我们的网站会生成日期时间异常。

4 个答案:

答案 0 :(得分:12)

您应该在将字符串转换为日期时指定要使用的文化。

您应该使用的文化取决于日期格式化的文化。例如,如果您要解析的所有日期都格式化为斯洛伐克

String s = "24. 10. 2011";

然后你需要像在斯洛伐克(斯洛伐克)sk-SK)文化一样解析字符串:

//Bad:
d = DateTime.Parse(s);

//Good:
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia)

如果您的日期都在塔吉克语(塔吉克斯坦西里尔语)中,那么您需要将其解析为tg-Cryl-Tj

String s = "24.10.11"

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));

这导致了一个问题:您使用的日期格式是什么?你不应该依赖服务器的语言环境设置,你应该决定你想要的格式。

//Bad
String s = d.ToString();

//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)

//s = "2011-10-24 12:00:00 පෙ.ව."

我怀疑你更喜欢用英语做所有事情。但是你必须决定哪种英语变体:

  • en-AU(英语Austrailia):24/10/2011
  • en-IA(英文印度):24-10-2011
  • en-ZA(英语南非):2011/10/24
  • en-US(英语美国):10/24/2011

我怀疑您更喜欢英语(印度)en-IA)。


但是如果你真的无法决定在将日期转换为字符串时使用什么文化,反之亦然,并且日期永远不会向用户显示,那么你可以使用不变文化

String s = "10/24/2011" //invariant culture formatted date

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string

答案 1 :(得分:1)

永远不要将日期内部存储为字符串。不在数据库中,不在您的应用程序中。

如果您需要在服务器之间移动日期值,请转到二进制文件。或者,如果您真的必须使用字符串,请使用ToString(CultureInfo.InvariantCulture) - 或者只是序列化Ticks属性。

此外,永远不要使用您使用代码构建的SQL命令将日期作为字符串传递给数据库。使用SqlParameter,甚至更好地依赖于某些O / R Mapper,例如Entity Framework或Linq to SQL。

答案 2 :(得分:0)

从不依赖服务器的默认语言环境。对于您的情况,这意味着:

  • 使用预准备语句将日期作为(未格式化的)日期对象而不是(格式化)字符串对象。您永远不应该使用字符串来表示应用程序中的日期,因为您无法对它们执行日期特定的功能(例如,添加1个月,获取当前周的最后一天等)。

  • 如果确实需要在应用程序中使用字符串对象,则在任何地方使用to_dateto_char等SQL函数(确切的名称取决于您的DBMS) / p>

答案 3 :(得分:0)

如果部署到不受您控制的服务器上,确保您的代码没有文化上的硬编码依赖关键非常重要。

您很可能希望在代码中搜索DateTime.Parse或类似内容。我们在DateTime上有一组扩展方法,我们使用它们来强制正确的文化。