对于美国文化,我们看到.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中。解析工作正常。
答案 0 :(得分:2)
来自MSDN:
用户可能会选择覆盖与之关联的某些值 Windows的当前文化通过区域和语言 控制面板的选项部分。例如,用户可能会选择 以不同的格式显示日期或使用其他货币 比文化的默认值。如果文化标识符关联 名称与当前Windows的区域性标识符匹配 在这个文本中,这个构造函数创建了一个使用它们的CultureInfo对象 覆盖,包括属性的用户设置 DateTimeFormat属性返回的DateTimeFormatInfo实例, 和返回的NumberFormatInfo实例的属性 NumberFormat属性。如果用户设置与。不兼容 文化与CultureInfo相关联,例如,如果选中 日历不是OptionalCalendars之一,结果 方法和属性的值是未定义的。
所以我的猜测是你想使用the following constructor:
public CultureInfo(string name, bool useUserOverride)
并将useUserOverride
设置为false
。