提问人:Michael Freidgeim 提问时间:8/28/2023 更新时间:8/28/2023 访问量:216
月份缩写显示 4 个字符而不是 3 个字符
Month abbreviations show 4 characters instead of 3
问:
我在代码中
string dateStr = dateTime.ToString("dd-MMM-yyyy");
在我的 Windows 11 机器上,它不是“21-Sep-2021”,而是生成带有 4 个字符缩写“21-Sept-2021”的月份。
它在服务器和其他开发人员计算机上正确生成为 3 个字符。https://learn.microsoft.com/en-us/dotnet/api/system.globalization.datetimeformatinfo.abbreviatedmonthnames?view=net-7.0#property-value
我没有找到可以更改设置的位置。我按照 https://pureinfotech.com/change-time-date-windows-11/ 中的建议进行了设置 但一切看起来都不错,本地化显示“English-Australia”
我已经确认澳大利亚有 3 个字符的月份缩写 https://lh.2xlibre.net/locale/en_AU/ 并且在第 https://lh.2xlibre.net/values/abmon/ 页上没有本地化有 4 个字符的月份缩写。
我很好奇哪种设置会导致这种行为?
作为解决方法,我显式指定了 InvariantCulture
dateTime.ToString("dd-MMM-yyyy",CultureInfo.InvariantCulture);
答:
使用固定区域性
使用固定区域性将解决此问题。不知道为什么会发生这种情况,但是由于某种原因,正在使用的对象已被自定义,这可能是问题所在。DateTimeFormatInfo
代码:
string dateStr = dateTime.ToString("dd-MMM-yyyy", System.Globalization.CultureInfo.InvariantCulture);
使用显式区域性
根据您的情况,您还可以显式设置区域性。
所以如果你想要美式英语格式,你可以这样做。对于美式英语,代码为 。Use-Case
en-US
代码:
var culture = new System.Globalization.CultureInfo("en-US");
string dateStr = dateTime.ToString("dd-MMM-yyyy", culture);
其他语言代码可以在互联网上找到。
评论
hard-code EN-US
de-CH
CultureInfo.GetCultures(CultureTypes.AllCultures)
.问题不在于如何使用一种特定的文化。 并非如此 - InvariantCulture 使用美国日期格式 () 而不是实际的不变标准,ISO8601,因此除非您想在美国显示日期,否则这是错误的。Good for every use-case
09/21/2023 00:00:00
这其实很......没有错,尽管它可能不正确。
月份的标准缩写是:
- ...
- 9 月 – “9 月”
- ...
在 Windows 11 上,使用 NET (Core) 8,使用 dotnet-repl,此脚本:
var dateTime=new DateTime(2023,9,21);
var cults=CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(ci=>dateTime.ToString("dd-MMM-yyyy",ci)=="21-Sept-2023");
foreach(var cult in cults)
{
Console.WriteLine("{0} {1}",cult.Name,cult.DisplayName);
}
生产
en-AU English (Australia)
en-GB English (United Kingdom)
MMM
是月份缩写的说明符,而不仅仅是月份的前三个字母,就像全名的说明符一样。MMMM
Windows 由最终用户使用,而不仅仅是开发人员,因此我怀疑存在 Windows 应用程序不生成官方缩写的错误,即使它们不是某个国家/地区最常用的缩写。
我见过关于(南非)和(津巴布韦)的类似问题。在至少一种情况下,两者都被用作数字分隔符。一个官方,一个不是。en-ZA
en-ZW
.
,
评论
dd-MMM-yyyy
Thread.CurrentCulture
dateTime.ToString("MMM",CultureInfo.GetCultureInfo("de-DE")
Sept
dd-MMM-yyyy
21-Sept.-2023
Accept-Languages