月份缩写显示 4 个字符而不是 3 个字符

Month abbreviations show 4 characters instead of 3

提问人:Michael Freidgeim 提问时间:8/28/2023 更新时间:8/28/2023 访问量:216

问:

我在代码中

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);
C# 日期格式

评论

0赞 AztecCodes 8/28/2023
这确实很有趣。您是否尝试过将 Windows 11 语言更改为美式英语?
1赞 Ralf 8/28/2023
也许是 NLS 与 ICU 问题之一。learn.microsoft.com/en-us/dotnet/core/extensions/......
0赞 Ralf 8/28/2023
意味着根据具体的 Win10/Win11 修补版本和/或使用的框架,这些名称使用不同的来源,并且它们可能不同。
0赞 Panagiotis Kanavos 8/28/2023
实际区域设置是什么?短月份名称由 Windows 提供。如果区域设置使用 4 而不是 3 个字母的缩写,则将返回 4 个字符。您可以使用 .dd-MMM-yyyyThread.CurrentCulture
0赞 Panagiotis Kanavos 8/28/2023
我发现返回但返回.所有德国文化都是这样做的。线程的实际区域性是什么,应用程序类型是什么?在具有区域性检测的 Web 应用中,标头可用于修改线程的区域性dateTime.ToString("MMM",CultureInfo.GetCultureInfo("de-DE")Septdd-MMM-yyyy21-Sept.-2023Accept-Languages

答:

1赞 AztecCodes 8/28/2023 #1

使用固定区域性

使用固定区域性将解决此问题。不知道为什么会发生这种情况,但是由于某种原因,正在使用的对象已被自定义,这可能是问题所在。DateTimeFormatInfo

代码:

string dateStr = dateTime.ToString("dd-MMM-yyyy", System.Globalization.CultureInfo.InvariantCulture);

使用显式区域性

根据您的情况,您还可以显式设置区域性。 所以如果你想要美式英语格式,你可以这样做。对于美式英语,代码为 。Use-Caseen-US

代码:

var culture = new System.Globalization.CultureInfo("en-US");
string dateStr = dateTime.ToString("dd-MMM-yyyy", culture);

其他语言代码可以在互联网上找到。

评论

0赞 Panagiotis Kanavos 8/28/2023
这个答案说,因为不变文化本质上是美国文化。这并没有真正的帮助。hard-code EN-US
0赞 AztecCodes 8/28/2023
@PanagiotisKanavos 你基本上可以选择世界上所有的语言吗?只需查找代码即可。例如,瑞士是.不变文化适用于不限于一种语言的每个用例。de-CH
0赞 Panagiotis Kanavos 8/28/2023
CultureInfo.GetCultures(CultureTypes.AllCultures).问题不在于如何使用一种特定的文化。 并非如此 - InvariantCulture 使用美国日期格式 () 而不是实际的不变标准,ISO8601,因此除非您想在美国显示日期,否则这是错误的。Good for every use-case09/21/2023 00:00:00
0赞 AztecCodes 8/28/2023
@PanagiotisKanavos 是的,我的意思是,最后你必须决定某种格式。在某些情况下,您可以从用户系统或User-Agent读取它,但是您始终需要指定格式。如果通过指定它来解决四个字母的问题,我看不出有什么理由不这样做。
1赞 Panagiotis Kanavos 8/28/2023 #2

这其实很......没有错,尽管它可能不正确。

摘自《澳大利亚政府风格手册》,日期和时间

月份的标准缩写是:

  • ...
  • 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-ZAen-ZW.,