如何在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
使用多个线程,如果您设置了当前线程的CurrentCulture
或CurrentUICulture
,其他可能会有所不同。
尝试使用DefaultThreadCurrentCulture
和DefaultThreadCurrentUICulture
:
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 页面中拒绝匿名用户?