【问题标题】:How to set date formats and culture in asp.net core razor pages 2.2如何在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 的日期吗??

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

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

提前致谢!!

【问题讨论】:

标签: c# asp.net-core date-formatting razor-pages culture


【解决方案1】:

这里有两个问题:

  1. 如何正确本地化 Web 应用程序和
  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 中间件的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 应用程序中设置本地化。
猜你喜欢
  • 2020-11-18
  • 2018-09-12
  • 2018-05-21
  • 1970-01-01
  • 2017-11-25
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多