代码之家  ›  专栏  ›  技术社区  ›  John_

新服务器上的.NET全局文化

  •  0
  • John_  · 技术社区  · 16 年前

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

    我正在使用Windows Server 2008和IIS7,如果这有什么帮助的话。

    使用的字符串被硬编码到页面中,因为它是一次性网站注册表的截止日期。

    正在运行的代码如下:

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

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Alfred Myers    16 年前

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

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

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

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


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

    转换。ToDateTime是一个“便利”方法,实现如下:

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

    请注意,它调用DateTime。解析传递显式的CultureInfo(CultureInfo.CurrentCulture)。

    文化信息。CurrentCulture从Thread获取它的值。当前线程。当前文化。

    您可以查看CultureInfo。CurrentCulture查看它实际返回的CultureInfo和/或进一步调查以尝试理解正在发生的事情,但另一方面,建议您 将字符串解析为其他数据类型(如DateTime、Double等)时使用的格式化程序。

    正如我在最初的回答中所说,有一个FxCop(静态分析)规则来检查是否缺少传递给重载方法的IFormatProvider,这些重载方法接收IFormatProvider的实例: CA1305 .

    所以我建议你重写代码,大致如下:

    
    if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB")))
    
        2
  •  1
  •   John_    16 年前

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

        3
  •  0
  •   Ian Boyd    14 年前

    当您将字符串转换为日期时,您应该指定要使用的区域性。

    您应该使用的区域性取决于日期的格式。例如,如果您正在解析的所有日期的格式都是 斯洛伐克语 :

    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 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