Я использую приложение Asp.Net Core 2.2 Razor Pages. Я хочу установить культуру приложения и форматы даты на уровне приложения. Итак, после некоторого поиска в Google я добавляю приведенный ниже код в метод ConfigureServices в Startup.cs.
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() возвращает 25.06.2019 вместо 25.06.2019. Такая же проблема с DateTime.Now.ToLongDateString()
И если я изменю формат на «дд/мм/гггг», будет ли возвращена дата в формате 25.06.2019??
Я запускаю это в своей локальной среде разработки. Также я ожидаю, что мое приложение будет получать даты в том же формате, который я установил выше, в любой среде, на любой машине, в любой культуре.
Пожалуйста, помогите и подскажите, где я ошибаюсь.
Заранее спасибо!!
Как установить формат короткой и длинной даты при использовании app.UseRequestLocalization ??





Ваш WebApplication использует несколько потоков, если вы установите CurrentCulture или CurrentUICulture текущего потока, другие могут отличаться.
Попробуйте использовать DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture :
CultureInfo.DefaultThreadCurrentUICulture = culture;
CultureInfo.DefaultThreadCurrentCulture = culture;
Это никак не влияет на культуру запросов. ASP.NET Core имеет собственный механизм локализации и даже определяет предпочитаемые языки браузер и использует их для форматирования данных.
Я использую это для установки локализации в своем приложении ASP.NET Core.
Тут есть два вопроса:
ASP.NET Core и ASP.NET предлагают собственные функции глобализации и локализации, которые работают на нескольких уровнях (приложение, страница, запрос). Вы должны проверить Глобализация и локализация в ASP.NET Core, чтобы понять, как эти функции работают в ASP.NET Core. Как и все остальное, услуги предоставляются через промежуточное ПО.
Об этом тоже много сообщений в блогах. Я выбрал этот из-за названия Интернационализация — ASP.NET Core: от 0 до излишеств. Он объясняет то же самое, что и документация, но более лаконично.
Однако для вашего конкретного вопроса все, что нужно, это установить культуру для каждого запроса. Это можно сделать методом 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, даты, которые сохраняются в базе данных, имеют другой формат. Пожалуйста помогите.
@ Абдул, это не то, о чем ты спрашивал. EF не имеет ничего общего с веб-приложениями, это ORM. В любом случае даты имеют формат нет, это бинарные значения. Форматы применяются только тогда, когда строки разбор преобразуются в даты или форматируются в строки. Возможно, вы ошибочно приняли способ отображения даты в клиентском инструменте за реальный формат?
Да я немного запутался. Я думаю, что ошибся, как вы сказали. Извините, я нахожусь в стадии обучения.
@AbdulAbdul, в основном это вина Microsoft - EF и ASP.NET Core - это отдельные команды, и раньше у них были разные репозитории. Пару лет назад решили, что лучше всего поставить EF под ASP.NET Core, хотя речь идет не только о веб-разработке. Это смутило много людей, и половина вопросов EF недавно использовали неправильные теги.
Начните с документов Глобализация и локализация в ASP.NET Core. Вы можете установить локаль запроса через промежуточное ПО локализации. Вам может не понадобиться ничего, кроме звонка
app.UseRequestLocalizationс культурой, которую вы хотите