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