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

Mur*_*aza 7 c# sql asp.net datetime-format

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

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

Ian*_*oyd 12

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

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

String s = "24. 10. 2011";
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

String s = "24.10.11"

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));
Run Code Online (Sandbox Code Playgroud)

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

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

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

//s = "2011-10-24 12:00:00 ??.?."
Run Code Online (Sandbox Code Playgroud)

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

  • en-AU (英语澳大利亚): 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
Run Code Online (Sandbox Code Playgroud)