Время в формате UTC в ASP.NET Core до местного
Я использую ASP.NET Core 5 и Entity Framework Core в качестве ORM. Получаю время в формате UTC из приложения Angular. Но пользователь будет только из одной страны. Поэтому я решил преобразовать время UTC в местное - т.е. часовой пояс Индии - при сохранении в базе данных.
Мои вопросы:
- Как я могу настроить приложение ASP.NET Core, чтобы всегда преобразовывать время UTC в
en-IN
при хранении в базе данных? - Кроме того, мне нужно преобразовать местное время обратно в 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.