2009-09-30 33 views
0

我们刚搬到新的服务器上,一切进展顺利。不过,在我尝试将格式为“dd/mm/yyyy”的字符串转换为日期时,我遇到了.NET错误,现在我更改了本地web.config中的文化设置,但我们要求这是全局的。新服务器上的.NET全球文化

我该在哪里更改?我假定machine.config,但在旧服务器上找不到任何熟悉的设置。

或者我应该在服务器端查找设置,将机器上的文化设置为en-GB?

==更新== 我已经更改了区域设置,但仍然失败。是否有一个machine.config全局设置,可能会搞砸了?目前它似乎在使用不变和失败。

我使用Windows Server 2008与IIS7,如果这是任何帮助。

正在使用的字符串被硬编码到页面中,因为它是关闭注册表单的关闭日期。

的代码是跑如下:

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00")) 

很简单,现在已经工作过一百万次,这是只在出现此错误这个新的设置。

+0

您是否已将地区设置更改为en-GB或en-US? – 2009-09-30 14:36:56

+0

区域和语言选项控制面板中的所有内容都已设置为英国。 – 2009-09-30 14:47:50

+0

你从哪里得到这个日期?它是否保存在磁盘或其他地方?它是否在相同的进程或线程中生成?它是由另一个程序产生的吗?请给我们更多关于应用场景的信息。 – 2009-09-30 15:13:12

回答

1

到底(我不知道这是否是做的最好的办法还是没有),我不得不选择计算机从IIS7内部并将全球化设置设置为en-GB。这确实解决了这个问题,并将在未来的所有其他网站保留在该文化中,除非另有说明。

请注意,我已经将计算机区域设置更改为英国,但尚未解决问题。

然而,我将从现在开始与阿尔弗雷德的指定文化解析日期的建议。

+0

这条线路适用于我,更改了机器的语言环境,需要重新启动。 – CountZero 2009-10-08 14:30:09

+0

我也这么做了,我确定我错过了一些我根本找不到的东西。 – 2009-10-08 21:29:18

2

迁移服务器时,我建议您使用与以前相同的区域设置(控制面板) - 如果可以的话。只要这样做,就可以避免很多问题。

这可能是不可能的,但是如果新服务器将要托管其他区域设置的应用程序,或者由于新策略而必须应对。

在任何情况下,在所有Parse和ToString()调用期间明确指定适用的格式是最佳实践。

甚至有一个FxCop(和静态分析)规则。


更新,以反映问题的新的信息:它调用DateTime.Parse传球


public static DateTime ToDateTime(string value) 
{ 
    if (value == null) 
    { 
     return new DateTime(0L); 
    } 
    return DateTime.Parse(value, CultureInfo.CurrentCulture); 
} 

注:

Convert.ToDateTime是一个 “方便” 的方法,只要实施一个明确的CultureInfo(CultureInfo.CurrentCulture)。

CultureInfo.CurrentCulture从Thread.CurrentThread.CurrentCulture中获取它的值。

您可以在CultureInfo.CurrentCulture看一看,看看有什么的CultureInfo它实际上是返回和/或进一步调查,试图了解发生了什么,但另一方面,则建议您明确指定的在将字符串解析为其他数据类型(如DateTime,Double等)时使用的格式化程序。

正如我在我的原始答案中所说的那样,有一个FxCop(静态分析)规则来检查是否缺少IFormatProvider传递给有重载接收实例的方法:CA1305

因此,我建议你重写代码的东西沿着线:


if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB"))) 
+0

我已经更改了区域设置,但仍然不幸失败。 是否有一个machine.config的全局设置,可能会搞砸了?目前它似乎在使用不变量。 – 2009-09-30 14:16:31

+0

我很欣赏这些额外的信息,我将会明确地将其纳入未来。然而,它实际上并没有解决我的问题,因为我有大约30个需要更新的网站,而不是时间去做。 – 2009-10-01 14:35:33

+0

我投票赞成好的答案。 – 2009-10-01 14:36:09

0

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

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

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-IA(英文印度):24-10-2011 15:19:52
  • en-BZ(英文伯利兹):24/10/2011 03:19:52 PM
  • en-AU(英文Austrailia):24/10/2011 3:19:52 PM
  • en-NZ(英文新西兰):24/10/2011 3:19:52 p.m.
  • en-GB(英国英国):24/10/2011 15:19:52
  • en-ZA(英文南非):2011/10/24 03:19:52 PM
  • en-US(英语美国):10/24/2011 3:19:52 PM

但如果你真的不能决定转换日期字符串和副时使用何种文化反之亦然,以及日期都从未想过要显示给用户,那么你可以使用不变文化

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