0

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

我在哪里改变这个?我假设 machine.config 但在旧服务器上找不到任何熟悉的设置。

还是我应该查看服务器端并找到将机器上的文化设置为 en-GB 的设置?

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

如果有任何帮助,我正在使用带有 IIS7 的 Windows Server 2008。

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

正在运行的代码如下:

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

非常简单,之前已经工作了一百万次,只有在这个新设置上才会出现这个错误。

4

3 回答 3

2

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

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

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

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


更新以反映有关该问题的新信息:

Convert.ToDateTime 是一种“方便”方法,实现为:


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

请注意,它调用 DateTime.Parse 传递显式 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")))
于 2009-09-30T14:10:46.813 回答
1

最后(我不确定这是否是最好的方法)我不得不从 IIS7 中选择计算机并将全球化设置设置为 en-GB。这确实解决了问题,并且除非另有说明,否则将来我的所有其他网站也将保持这种文化。

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

但是,从现在开始,我将继续执行 Alfred 的建议,即指定将日期解析为的文化。

于 2009-10-01T14:38:15.840 回答
0

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

您应该使用的文化取决于日期格式的文化。例如,如果您正在解析的所有日期都被格式化为Slovak

String s = "24. 10. 2011";

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

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

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

如果您的日期都是Tajik (Tajikistan Cyrillic),那么您需要将其解析为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(澳大利亚英语):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

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

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
于 2011-10-24T19:24:32.633 回答