.NET DateTime ToString Culture en-US在某些盒子上输出4位数年份,在其他盒子上输出2位数年份

时间:2017-10-25 13:46:59

标签: c# asp.net .net datetime

对于美国文化,我们看到.NET的DateTime ToString()似乎是异常/不一致," en-US"。在某些Windows系统上,显示四位数年份,而在其他系统上,相同代码相同文化,en-US显示两位数年份。

在我们的Windows 2016服务器上,以下代码显示10/25/1999,这正是我们所期望的。

在我们的Windows 10 Pro工作站的部分上,以下代码显示为10/25/1999,但在其他代码上显示为10/25/99。我们尚未找出方框之间的原因/差异。有些盒子升级到Fall Creator的更新,有些盒子安装了.NET 4.7.1,一个显示10/25/99的盒子几个月没有更新(我们打开它只是为了运行这个测试)。 / p>

演示此问题的代码是:

var date = DateTime.Parse("10/25/1999", CultureInfo.InvariantCulture);

// correctly, always displays 1999
Console.WriteLine(date.Year);
// correctly, always displays 10/25/1999
Console.WriteLine(date.ToString("d", CultureInfo.InvariantCulture));

// **INCONSISTENT--displays 10/25/1999 on some boxes and 10/25/99 on others**
Console.WriteLine(date.ToString("d", new CultureInfo("en-US")));

// **INCONSISTENT--displays 10/25/1999 12:00:00 AM on some boxes and 10/25/99 12:00:00 AM on others**
Console.WriteLine(date.ToString(new CultureInfo("en-US")));

// Force formatting--correctly, always displays 10/25/1999
Console.WriteLine(date.ToString("MM/dd/yyyy", new CultureInfo("en-US")));  

我们已针对.NET Frameworks进行了测试,范围从v2到v4.7.1以及x64和x86两种模式。改变这些不会改变显示的位数。看起来好像根据某些操作系统设置配置了en-US文化的数字位数。

我可能遗漏了一些明显的东西。感谢您的帮助和见解。

P.S。我查看了像Strange behaviour of DateTime.Parse这样的线程,但这似乎不是问题,因为我们看到的问题是在ToString中。解析工作正常。

1 个答案:

答案 0 :(得分:2)

来自MSDN

  

用户可能会选择覆盖与之关联的某些值   Windows的当前文化通过区域和语言   控制面板的选项部分。例如,用户可能会选择   以不同的格式显示日期或使用其他货币   比文化的默认值。如果文化标识符关联   名称与当前Windows的区域性标识符匹配   在这个文本中,这个构造函数创建了一个使用它们的CultureInfo对象   覆盖,包括属性的用户设置   DateTimeFormat属性返回的DateTimeFormatInfo实例,   和返回的NumberFormatInfo实例的属性   NumberFormat属性。如果用户设置与。不兼容   文化与CultureInfo相关联,例如,如果选中   日历不是OptionalCalendars之一,结果   方法和属性的值是未定义的。

所以我的猜测是你想使用the following constructor

public CultureInfo(string name, bool useUserOverride)

并将useUserOverride设置为false