c#日期时间本地化错误

本文关键字:错误 本地化 时间 日期 | 更新日期: 2023-09-27 18:13:08

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

首先是一些代码:

        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。

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

如果我将英国机器的区域和语言更改为美国并重新启动机器,错误就会消失;所以我觉得我已经把问题定位在这个设置上了。这没有意义,为什么用英国标准格式化一个日期两次会返回美国标准呢?也许是字符串层出现了一些错误,它翻转了月份和日期?我很困惑。

更新:原来在英国模式下运行代码的嵌入式Windows机器有bug。在那台机器上,它实际上无法完全定位。现在我想知道,如果它的。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;
    }

c#日期时间本地化错误

您需要将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)
    {
    }