我得到了与同事相同文化的不同月份缩写。
var x = new DateTime(2023, 9, 27);
Console.WriteLine(x.ToString("MMM", new CultureInfo("en-GB")));
当针对 .Net 6 时,在 Windows 10 上我得到
Sep
,但在 Windows 11 上我得到 Sept
。
每个实例中都使用默认的
DateTimeFormatInfo.AbbreviatedMonthNames
。为什么会出现这种情况?
操作系统似乎是造成这种行为的原因。 Microsoft CultureInfo 文档(如另一个 Stack Overflow 答案中所述)声明如下:
文化名称和标识符仅代表文化的子集 可以在特定计算机上找到。 Windows 版本或 服务包可以更改可用的区域性。应用程序可以添加 使用 CultureAndRegionInfoBuilder 类自定义区域性。用户可以 使用 Microsoft Locale Builder 工具添加自己的自定义文化。 Microsoft Locale Builder 是使用托管代码编写的 CultureAndRegionInfoBuilder 类。
有点不清楚这是否仅仅意味着可以添加和减去可用文化集,或者是否可以编辑文化内容。然而,我和我的同事看到的不同的缩写月份名称暗示内容可以通过操作系统修改。
注意这一点很重要,因为许多开发人员可能认为给定的文化在任何操作系统上都是相同的。
我来到这里,在 ASP.NET Razor Pages 项目 8.0 中遇到了同样的问题,即尽管使用相同的区域设置,但本地计算机和生产服务器上的日期和时间的表示方式不同。
我的本地机器是Windows 11 Pro,服务器是Windows 2022 Server。在这种特殊情况下,它是丹麦(丹麦)语言环境,与本地计算机/服务器不同。
在本地计算机上我会得到正确的格式:
30-11-2023 18:38:42
但是服务器会产生:
30.11.2023 18.38.42
// not entirely correct, i.e. time separator is wrong but dot-notation for date is fine.
我通过在
program.cs
中手动设置格式来修复它:
程序.cs:
var builder = WebApplication.CreateBuilder(args);
...
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("da-DK") {
DateTimeFormat = {
LongTimePattern = "HH:mm:ss",
ShortTimePattern = "HH:mm",
LongDatePattern = "dd. MMMM yyyy",
ShortDatePattern = "dd-MM-yyyy",
TimeSeparator = ":",
DateSeparator = "-"
}
}
};
options.DefaultRequestCulture = new RequestCulture(supportedCultures[0]);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Clear();
});
...
var app = builder.Build();
app.UseRequestLocalization();
指定
DateTimeFormat
有助于解决问题:
如果您注意屏幕截图中的这一行:
DateTime.Now.ToString(new CultureInfo("da-DK")) // returns 30.11.2023 18.38.42
您会看到它生成错误的格式而不是
30-11-2023 18:38:42
。我相信发生这种情况是因为 .NET 默认采用它从计算机/服务器知道的标准格式。