Время в формате UTC в ASP.NET Core до местного

Я использую ASP.NET Core 5 и Entity Framework Core в качестве ORM. Получаю время в формате UTC из приложения Angular. Но пользователь будет только из одной страны. Поэтому я решил преобразовать время UTC в местное - т.е. часовой пояс Индии - при сохранении в базе данных.

Мои вопросы:

  1. Как я могу настроить приложение ASP.NET Core, чтобы всегда преобразовывать время UTC в en-IN при хранении в базе данных?
  2. Кроме того, мне нужно преобразовать местное время обратно в UTC при отправке данных в API.

Пожалуйста, предложите приложение. Местное время всегда en-IN, но размещены в одной / разных странах.

Пожалуйста, дайте мне знать, как преобразовать время UTC в местное время (en-IN) и наоборот

2 ответа

В ядре asp.net самый простой способ преобразовать время в формат UTC - это вызвать статический (общий в Visual Basic) метод TimeZoneInfo.ConvertTimeToUtc(DateTime).

        DateTime dateNow = DateTime.Now;

        Console.WriteLine("Local date and time: " + dateNow);

        var kind = dateNow.Kind;
        Console.WriteLine("The date and time are {0} UTC.",
                           TimeZoneInfo.ConvertTimeToUtc(dateNow));

Затем, чтобы преобразовать время в формате UTC во время в любом указанном часовом поясе, вызовите метод ConvertTimeFromUtc.

        DateTime timeUtc = DateTime.UtcNow;
        try
        {
            TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
            DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
            Console.WriteLine("The date and time are {0} {1}.",
                              cstTime,
                              cstZone.IsDaylightSavingTime(cstTime) ?
                                      cstZone.DaylightName : cstZone.StandardName);
        }
        catch (TimeZoneNotFoundException)
        {
            Console.WriteLine("The registry does not define the India Standard Time zone.");
        }
        catch (InvalidTimeZoneException)
        {
            Console.WriteLine("Registry data on the India Standard Time zone has been corrupted.");
        }

Более подробную информацию см. В разделе " Преобразование времени между часовыми поясами и метод DateTime.ToUniversalTime (преобразование строки даты и времени в объект DateTime)".

Кроме того, вы также можете использовать JavaScript для преобразования даты и времени между временем UTC и местным временем.

Чтобы преобразовать время UTC в местное время (с определенным часовым поясом) с помощью JavaScript, вы можете попробовать использовать метод Date.prototype.toLocaleString().

Пример кода, как показано ниже:

const event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

// British English uses day-month-year order and 24-hour time without AM/PM
console.log(event.toLocaleString('en-IN', { timeZone: 'UTC' }));
// expected output: 20/12/2012, 03:00:00

// Korean uses year-month-day order and 12-hour time with AM/PM
console.log(event.toLocaleString('ko-KR', { timeZone: 'UTC' }));
// expected output: 2012. 12. 20. 오전 3:00:00

console.log('USA time: '+ event.toLocaleString("en-US", {timeZone: "America/New_York"}))
// expected output: USA time: 2020-11-15T13:20:52.000Z 

console.log('India time: '+ event.toLocaleString("en-US", {timeZone: "Asia/Kolkata"}))
// expected output: India time: 2020-11-15T23:50:52.000Z

Чтобы преобразовать местное время во время UTC, вы можете попробовать использовать метод объекта Date toUTCString() или метод Date.UTC().

Редактировать:

Кроме того, ASP.NET Core MVC поддерживает обмен данными в веб-API с использованием средств форматирования ввода и вывода. Устройства форматирования ввода используются привязкой модели. Средства форматирования вывода используются для форматирования ответов.

Вы можете обратиться к следующему образцу кода для форматирования данных ответа, он преобразует локальное datetime во время UTC:

Создайте собственный конвертер даты и времени:

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}

Настройте пользовательский преобразователь (в ASP.NET Core 3.0 или более поздних версиях средства форматирования JSON по умолчанию основаны на System.Text.Json):

        services.AddControllersWithViews().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
        });

[Примечание] используя приведенный выше код, он просто форматирует данные ответа вместо изменения входных данных.

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

В Date.setMinutes() функция ожидает значение от 0 до 59.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes

Я бы взял смещение часового пояса пользователя и поместил значение в файл cookie. Как вы создаете код, зависит от вашего приложения. Если пользователь должен войти в систему, я бы получил значение при входе пользователя в систему. Если вы используете ASP Identity, вы можете сохранить смещение часового пояса как утверждение. Затем выполните математические вычисления на сервере, где функции даты более надежны.

В противном случае вам нужно будет написать date.addMinutes функцию в JavaScript или используйте существующую библиотеку, например Moment.

https://momentjs.com/

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