Как установить формат даты и культуру на страницах asp.net core razor 2.2

Я использую приложение 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??

Я запускаю это в своей локальной среде разработки. Также я ожидаю, что мое приложение будет получать даты в том же формате, который я установил выше, в любой среде, на любой машине, в любой культуре.

Пожалуйста, помогите и подскажите, где я ошибаюсь.

Заранее спасибо!!

Начните с документов Глобализация и локализация в ASP.NET Core. Вы можете установить локаль запроса через промежуточное ПО локализации. Вам может не понадобиться ничего, кроме звонка app.UseRequestLocalization с культурой, которую вы хотите

Panagiotis Kanavos 25.06.2019 09:54

Как установить формат короткой и длинной даты при использовании app.UseRequestLocalization ??

fingers10 25.06.2019 10:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
9 216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш WebApplication использует несколько потоков, если вы установите CurrentCulture или CurrentUICulture текущего потока, другие могут отличаться.

Попробуйте использовать DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture :

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

Это никак не влияет на культуру запросов. ASP.NET Core имеет собственный механизм локализации и даже определяет предпочитаемые языки браузер и использует их для форматирования данных.

Panagiotis Kanavos 25.06.2019 09:56

Я использую это для установки локализации в своем приложении ASP.NET Core.

koviroli 25.06.2019 10:00
Ответ принят как подходящий

Тут есть два вопроса:

  1. Как правильно локализовать веб-приложение и
  2. Как использовать пользовательскую культуру?

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, даты, которые сохраняются в базе данных, имеют другой формат. Пожалуйста помогите.

fingers10 25.06.2019 10:59

@ Абдул, это не то, о чем ты спрашивал. EF не имеет ничего общего с веб-приложениями, это ORM. В любом случае даты имеют формат нет, это бинарные значения. Форматы применяются только тогда, когда строки разбор преобразуются в даты или форматируются в строки. Возможно, вы ошибочно приняли способ отображения даты в клиентском инструменте за реальный формат?

Panagiotis Kanavos 25.06.2019 11:04

Да я немного запутался. Я думаю, что ошибся, как вы сказали. Извините, я нахожусь в стадии обучения.

fingers10 25.06.2019 11:49

@AbdulAbdul, в основном это вина Microsoft - EF и ASP.NET Core - это отдельные команды, и раньше у них были разные репозитории. Пару лет назад решили, что лучше всего поставить EF под ASP.NET Core, хотя речь идет не только о веб-разработке. Это смутило много людей, и половина вопросов EF недавно использовали неправильные теги.

Panagiotis Kanavos 25.06.2019 11:53

Другие вопросы по теме