我们有一个 ASP.NET Core 8 网站:
da-DK
。Startup
内的C#代码中,它显示TimeSeparator
是':'
,DateSeperator
是'-'
。System.Threading.Thread.CurrentThread.CurrentCulture
的 MVC 视图中,它显示 TimeSeparator
是 '.'
,DateSeperator
是 '.'
。如果我创建
DateTime.ToString("dd-MM-yyyy HH:mm")
,它将在 MVC 视图中返回 dd.MM.yyyy HH.mm
形式的字符串,但在项目其他地方的非 Razor C# 代码中返回 dd-MM-yyyy HH:mm
形式的字符串。
代码是.net 8,这个bug是前几天突然出现的。
这是我在我看来使用的代码,用于查看实际作为文化传递的值和
ToString()
@using System.Threading
<div style="display:none;">
<p>@Thread.CurrentThread.CurrentCulture.Name</p>
<p>@Thread.CurrentThread.CurrentCulture.DateTimeFormat.TimeSeparator</p>
<p>@Thread.CurrentThread.CurrentCulture.DateTimeFormat.DateSeparator</p>
<p>@DateTime.Now.ToString("dd-MM-yyyy HH:mm")</p>
</div>
这是我在Azure中得到的结果:
<div style="display:none;">
<p>da-DK</p>
<p>.</p>
<p>.</p>
<p>09-11-2024 23.20</p>
</div>
这是我在本地主机中得到的结果
<div style="display:none;">
<p>da-DK</p>
<p>:</p>
<p>-</p>
<p>09-11-2024 23:44</p>
</div>
我的
Startup.cs
里有这个:
var cultureInfo = new CultureInfo("da-DK");
cultureInfo.DateTimeFormat.TimeSeparator = ":";
cultureInfo.DateTimeFormat.DateSeparator = "-";
var supportedCultures = new CultureInfo[] { cultureInfo };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(supportedCultures[0]),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
如果我在后端执行相同的操作,它会返回预期结果
dd-MM-yyyy HH:mm
。
我认为我不能做得比这更好,我无法解释。
整个事情是在最新上传后两天开始的。
我尝试测试RequestCulture,这是我在Azure中得到的结果(LocalHost按预期返回):
@{
var requestCulture= HttpContextAccessor.HttpContext.Features.Get<Microsoft.AspNetCore.Localization.IRequestCultureFeature>().RequestCulture.Culture;
}
<div style="display:none;">
<p>da-DK</p>
<p>.</p>
<p>.</p>
<p>10-11-2024 00.42</p>
<p>da-DK</p>
<p>:</p>
<p>-</p>
</div>
我设法通过创建这个属性来解决这个问题
private CultureInfo Culture
{
get
{
var cultureInfo = new CultureInfo("da-DK");
cultureInfo.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy";
cultureInfo.DateTimeFormat.LongDatePattern = "dd-MM-yyyy HH:mm:ss";
cultureInfo.DateTimeFormat.DateSeparator = "-";
cultureInfo.DateTimeFormat.TimeSeparator = ":";
cultureInfo.DateTimeFormat.LongTimePattern = "HH:mm:ss";
cultureInfo.DateTimeFormat.ShortTimePattern = "HH:mm";
return CultureInfo.ReadOnly(cultureInfo);
}
}
在我的配置服务中我添加了以下代码:
CultureInfo.DefaultThreadCurrentCulture = Culture;
CultureInfo.DefaultThreadCurrentUICulture = Culture;
CultureInfo.CurrentCulture = Culture;
CultureInfo.CurrentUICulture = Culture;
在我的配置方法中,我添加了这些代码行:
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(Culture),
SupportedCultures = new[] { Culture },
SupportedUICultures = new[] { Culture }
};
app.UseRequestLocalization(options);