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

C# 如何在asp.net core razor pages 2.2中设置日期格式和区域性,c#,asp.net-core,date-formatting,razor-pages,culture,C#,Asp.net Core,Date Formatting,Razor Pages,Culture,我正在使用Asp.NETCore2.2RazorPages应用程序。我想在应用程序级别设置应用程序区域性和日期格式。所以在谷歌搜索之后,我在Startup.cs的ConfigureServices方法中添加了以下代码 public void ConfigureServices(IServiceCollection services) { // setting the application culture to en-US with MM/dd/yyyy

我正在使用Asp.NETCore2.2RazorPages应用程序。我想在应用程序级别设置应用程序区域性和日期格式。所以在谷歌搜索之后,我在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()
返回2019年6月25日,而不是2019年6月25日
DateTime.Now.ToLongDateString()也存在同样的问题。

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

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

请帮助和指导我在哪里错了


提前谢谢

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

尝试使用
DefaultThreadCurrentCulture
DefaultThreadCurrentUICulture

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

这里有两个问题:

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

    也有很多关于这个的博客帖子。我选择这一个是因为标题。它以更简洁的方式解释了文档所做的相同事情

    但是,对于您的特定问题,只需为每个请求设置区域性。这可以通过中间件的方法实现

    在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()
    
    在剃须刀页面中,这会产生

    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
    

    从文档开始。您可以通过设置请求区域设置。您可能只需要调用
    app.UseRequestLocalization
    ,使用
    app.UseRequestLocalization
    时设置短日期和长日期格式,这根本不会影响请求区域性。ASP.NET Core有自己的本地化机制,甚至可以检测浏览器的首选语言并使用它们来格式化数据。我使用它在我的ASP.NET Core应用程序中设置本地化。Hi@Panagiotis感谢您的回答和精彩的解释。这在代码中运行良好。但这不适用于ef核心迁移。在我的context
    OnModelCreating
    方法中,我有一些带有日期时间值的日期字段,当我添加迁移时,保存在数据库中的日期的格式不同。请帮忙。@Abdul你不是这么要求的。EF与web应用程序无关,它是一个ORM。在任何情况下,日期都没有格式,它们是二进制值。格式仅在将字符串解析为日期或将日期格式化为字符串时适用。也许你把客户端工具显示日期的方式错当成了实际的格式?是的,我有点困惑。我想我误解了你说的话。很抱歉,我正处于学习阶段。@Abdul这主要是微软的错误-EF和ASP.NET核心是独立的团队,过去有不同的回购协议。几年前,他们决定最好将EF置于ASP.NET核心之下,尽管这不仅仅是关于web开发。这让很多人感到困惑,最近有一半的EF问题使用了错误的标签。