如何在asp.net core razor pages 2.2中设置日期格式和文化

Posted

技术标签:

【中文标题】如何在asp.net core razor pages 2.2中设置日期格式和文化【英文标题】:How to set date formats and culture in asp.net core razor pages 2.2 【发布时间】:2019-06-25 07:33:16 【问题描述】:

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

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

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

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

提前致谢!!

【问题讨论】:

从文档Globalization and localization in ASP.NET Core 开始。您可以通过the localization middleware 设置请求区域设置。您可能只需要致电 app.UseRequestLocalization 了解您想要的文化 使用app.UseRequestLocalization时如何设置短日期和长日期格式?? 【参考方案1】:

这里有两个问题:

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

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 中间件的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

【讨论】:

嗨@Panagiotis 感谢您的回答和很好的解释。这在代码中运行良好。但这不适用于 ef 核心迁移。我在我的上下文OnModelCreating 方法中有一些带有日期时间值的日期字段,当我Add-Migration 时,保存在数据库中的日期格式不同。请帮忙。 @Abdul 这不是你问的。 EF 与 Web 应用程序无关,它是一个 ORM。在任何情况下,日期都有 no 格式,它们是二进制值。格式仅在将字符串解析 为日期或将日期格式化为字符串时适用。也许您将客户端工具显示日期的方式误认为是实际格式? 是的,我有点困惑。我想我误会了你所说的。很抱歉我正处于学习阶段。 @Abdul 这主要是微软的错 - EF 和 ASP.NET Core 是独立的团队,曾经有不同的存储库。几年前,他们决定最好将 EF 放在 ASP.NET Core 下,尽管它不仅仅与 Web 开发有关。这让 很多 人感到困惑,最近有一半的 EF 问题使用了错误的标签。【参考方案2】:

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

尝试使用DefaultThreadCurrentCultureDefaultThreadCurrentUICulture

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

【讨论】:

这根本不会影响请求文化。 ASP.NET Core 有自己的本地化机制,甚至会检测浏览器的首选语言并使用它们来格式化数据 我使用它在我的 ASP.NET Core 应用程序中设置本地化。

以上是关于如何在asp.net core razor pages 2.2中设置日期格式和文化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 的自定义 TagHelper 中呈现 Razor 模板?

如何在 asp.net core razor 页面中拒绝匿名用户?

如何多次提交表单(asp.net core razor)

如何ASP.NET Core Razor中处理Ajax请求

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表

如何使用 ASP.NET Core Razor 页面预选下拉列表中的项目