Asp. Net Core Convert UT C (YYYY-MM-DDThh: mm: ss.sTZD) ввод в LocalDateTime - PullRequest
0 голосов
/ 22 января 2020

Я работаю с MVC. Net Core API, который вводит значение DateTime как YYYY-MM-DDThh: mm: ss.sTZD. Однако, когда он отправляет данные в базу данных SQL, он выглядит как YYYY-MM-DDThh: mm: ss.s. (пример проблемы ниже)

Ввод

2020-01-21T17:05:30.3416751-05:00

Что записывается в базу данных

2020-01-21 22:05:30.343

Учитывая, что формат ввода указывает часовой пояс с -05: 00 в случае примера ввода, как я могу обеспечить преобразование значения в локальное перед записью в базу данных?

Я попытался изменить мой ModelBuilder в конструкторе Context, но это прекрасно работает для EntityFramework, но не для EntityFramework Core.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Итак, я добавил следующее в конструктор контекста

        var dateTimeConverter = new ValueConverter<DateTime, DateTime>(
            v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Local));
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            foreach (var property in entityType.GetProperties())
            {
                if (property.ClrType == typeof(DateTime) || property.ClrType == typeof(DateTime?))
                    property.SetValueConverter(dateTimeConverter);
            }
        }

И это преобразовало ввод в местное время.

Однако, Я обнаружил, что ввод был не тем, что я думал. Я действительно получал время ввода как UT C на стороне API. В клиентском приложении, через которое я отправляю данные в API, был установлен специальный сериализатор xml, который преобразовывал время в гггг-мм-ддтчммсс-stzd. Так что моя проблема была на стороне клиента, а не на стороне API.

Бонус: Мне говорят, что столбцы БД всегда должны быть UT C и в любом случае оставить его как есть. Это тот, кто превращает значения БД в отчет, чтобы преобразовать значения столбцов в местное время из UT C.

0 голосов
/ 22 января 2020

Просто попробуйте сбросить информацию о TimeZone следующим образом:

// Parse date string to DateTimeOffset
var DateTimeWithOffset = DateTimeOffset.Parse("2020-01-21T17:05:30.3416751-05:00"); // 21.01.2020 17:05:30 -05:00

// Or Parse exact
// var DateTimeWithOffset = DateTimeOffset.ParseExact("2020-01-21T17:05:30.3416751-05:00", "yyyy-MM-ddTHH:mm:ss.fffffffK", CultureInfo.CurrentCulture);

// Leave only DateTime ignoring it's offset, which makes DateTime local
var DateTimeLocal = DateTimeWithOffset.DateTime; // 21.01.2020 17:05:30

Затем вставьте DateTimeLocal в базу данных.

Это решение не будет работать, если вам нужно сохранить информацию о TimeZone в база данных.

...