C#Datetime Localization Bug?

时间:2014-07-14 21:31:37

标签: c# datetime localization

我发现了一个奇怪的错误,如果系统环境发生变化,本地化代码会失败。

首先是一些代码:

        CultureInfo local_culture = new CultureInfo("en-GB");
        String result = "2014/05/01";
        try
        {
            DateTime dt = DateTime.MinValue;

            if (DateTime.TryParse(result, out dt))
            {
                return String.Format(local_culture, "{0}", dt);
            }
        }
        catch (Exception e)
        {
        }

        return result;

如果您的地区和语言设置为英语(美国),则应该返回5/01/2014 12:00:00 AM。

但是当我在设置为英语(联合王国)的机器上运行相同的代码时,本地化失败,我回到美国格式:01/5/2014 12:00:00 AM

如果我将英国机器的区域和语言更改为美国并重新启动机器,则该错误消失;所以我觉得我已将问题本地化为此设置。 这没有任何意义,为什么要采用英国标准并按照美国标准进行两次格式化并将其格式化。也许是字符串级别的一些错误,它会翻转月份和日期? 我很茫然。

更新:当英国模式出错时,关闭运行代码的嵌入式Windows机器。它实际上无法在该机器上完全本地化。现在我想知道它是一个.net版本,而不是失败,无声地失败并返回输入。

想出来。如果您通过DateTime.TryParse发送美国日期,它将使用本地计算机的语言环境来解析它。如果日期格式不正确,并且原始代码未正确捕获解析失败,则会失败。我觉得很蠢。

这是正确的解决方案

    public static String LocalizeDate(String buffer)
    {
        String result = buffer;
        try
        {
            DateTime dt = DateTime.MinValue;
            DateTimeStyles styles = DateTimeStyles.None;
            CultureInfo input_culture = CultureInfo.CreateSpecificCulture("en-US");
            CultureInfo output_culture = CultureInfo.CreateSpecificCulture("en-GB");

            if (DateTime.TryParse(result, input_culture , styles, out dt))
            {                 
                return String.Format(output_culture , "{0}", dt);
            }
            else
            {
                Console.WriteLine("Input failed to turn into date time: " + buffer);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Failed to localize date with input: " + buffer);
            Console.WriteLine("Message: " + e);
        }

        return result;
    }

1 个答案:

答案 0 :(得分:2)

您需要将local_culture传递给TryParse

    CultureInfo local_culture = new CultureInfo("en-GB");
    DateTimeStyles styles;
    styles = DateTimeStyles.None;
    String result = "2014/05/01";
    try
    {
        DateTime dt = DateTime.MinValue;

        if (DateTime.TryParse(result, local_culture, styles, out dt))
        {
            Console.WriteLine(dt);
        }
    }
    catch (Exception e)
    {
    }