如何在 asp.net core razor pages 2.2 中设置日期格式和区域性

How to set date formats and culture in asp.net core razor pages 2.2

我正在使用 Asp.Net Core 2.2 Razor Pages 应用程序。我想在应用程序级别设置应用程序文化和日期格式。因此,经过一些谷歌搜索后,我最终在 Startup.cs

ConfigureServices 方法中添加了以下代码
public void ConfigureServices(IServiceCollection services)
        {
            // setting the application culture to en-US with MM/dd/yyyy short date pattern.
            var culture = CultureInfo.CreateSpecificCulture("en-US");
            var dateformat = new DateTimeFormatInfo { ShortDatePattern = "MM/dd/yyyy", LongDatePattern = "MM/dd/yyyy hh:mm:ss tt" };
            culture.DateTimeFormat = dateformat;
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;

但这似乎不起作用。我得到的日期格式错误。例子, DateTime.Now.ToShortDateString() returns 6/25/2019 而不是 06/25/2019。同样是DateTime.Now.ToLongDateString()

的问题

如果我将格式更改为 "dd/MM/yyyy",它会 return 25/06/2019 中的日期吗??

我在本地开发环境中是运行这个。我还期望我的应用程序能够在任何环境、任何机器、任何文化中以我上面设置的相同格式获取日期。

请大家指点指点我错的地方。

提前致谢!!

您的 WebApplication 使用多线程,如果您设置当前线程的 CurrentCultureCurrentUICulture,其他线程可能会有所不同。

尝试使用 DefaultThreadCurrentCultureDefaultThreadCurrentUICulture :

CultureInfo.DefaultThreadCurrentUICulture = culture;
CultureInfo.DefaultThreadCurrentCulture = culture;

这里有两个问题:

  1. 如何正确本地化网络应用程序和
  2. 如何使用自定义文化?

ASP.NET Core 和 ASP.NET 提供它们自己的全球化和本地化功能,可在多个级别(应用程序、页面、请求)上工作。您应该查看 Globalization and Localization in ASP.NET Core 以了解这些功能在 ASP.NET Core 中的工作原理。与其他一切一样,服务是通过中间件提供的。

也有很多关于此的博客文章。由于标题 Internationalization - ASP.NET Core: From 0 to overkill,我选择了这个。它以更简洁的方式解释了文档所做的相同事情。

不过,对于您的具体问题,您只需为每个请求设置文化即可。这可以通过with the localization middleware's UseRequestLocalization方法来完成。

在 Startup.cs 的 Configure(IApplicationBuilder, IWebHostEnvironment) 中,就在 app.UseStaticFiles() 之前,您可以添加对 UseRequestLocalization 的调用以指定文化:

var supportedCultures = new[]
{
   new CultureInfo("ru-RU"),                

};

app.UseRequestLocalization(new RequestLocalizationOptions{
    DefaultRequestCulture = new RequestCulture("ru-RU"),
    SupportedCultures=supportedCultures,
    SupportedUICultures=supportedCultures
});

我选择了 ru-RU,因为它使用点作为日期分隔符。放

@DateTime.Today.ToString()

在 Razor 页面中这会产生

25.06.2019 0:00:00

您也可以将自己的自定义文化传递给 UseRequestLocalization。使用此自定义区域性:

var culture = CultureInfo.CreateSpecificCulture("en-US");
var dateformat = new DateTimeFormatInfo { 
    ShortDatePattern = "MM/dd/yyyy", 
    LongDatePattern = "MM/dd/yyyy hh:mm:ss tt" 
};
culture.DateTimeFormat = dateformat;

var supportedCultures = new[]
{
    culture
};

app.UseRequestLocalization(new RequestLocalizationOptions{
    DefaultRequestCulture = new RequestCulture(culture),
    SupportedCultures=supportedCultures,
    SupportedUICultures=supportedCultures
});

产生:

06/25/2019 00:00:00