首页 > 解决方案 > 如何在asp.net core razor pages 2.2中设置日期格式和文化

问题描述

我正在使用 Asp.Net Core 2.2 Razor Pages 应用程序。我想在应用程序级别设置应用程序文化和日期格式。因此,经过一番谷歌搜索后,我最终在Startup.csConfigureServices的方法中添加了以下代码

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()返回6/25/2019而不是06/25/2019。同样是问题DateTime.Now.ToLongDateString()

如果我将格式更改为“dd/MM/yyyy”,它会返回25/06/2019的日期吗?

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

请协助和指导我哪里错了。

提前致谢!!

标签: c#asp.net-coredate-formattingrazor-pagesculture

解决方案


这里有两个问题:

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

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

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

不过,对于您的具体问题,所需要做的就是为每个请求设置文化。这可以通过本地化中间件的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

推荐阅读