ServiceStack — сериализация даты и времени из кэша, отличного от базы данных

#servicestack #servicestack.redis

#servicestack #servicestack.redis

Вопрос:

В моем приложении Servicestack я пытаюсь сериализовать дату и время из базы данных в стандарт RFC3339. Дата и время, хранящиеся в базах данных, являются локальным временем. Для моего приложения база данных расположена в 2 разных местоположениях: одно — Индонезия со смещением 7, другое — Малайзия со смещением 8. Обе базы данных хранятся с указанием местного времени соответственно.

Одно и то же приложение используется для обслуживания обеих баз данных из разных местоположений. Местное время для приложения со смещением 8, находится в Малайзии.

Если дата и время из базы данных Индонезии, например «2014-09-19 14:07:27.387» (2 часа дня), я добавлю смещение 7 в «2014-09-19T14:07:27.3870000 07:00»( 2 часа дня 7). Ниже приведен код для SerializeFn

 JsConfig<DateTime?>.SerializeFn = time =>
        {
            if (time != null)
            {
                DateTimeOffset dateTimeOffset = DateTimeZone.GetDateTimeOffset((DateTime)time, CommonFunction.GetDbCountryCode());
                return string.Format("{0:O}", dateTimeOffset);
            }
            return null;
        };
  

Коды для функции GetDateTimeOffset:

     public static DateTimeOffset GetDateTimeOffset(DateTime dateTime, string country)
    {
        switch (country.ToUpper())
        {
            case "ID":
                return new DateTimeOffset(dateTime, TimeSpan.FromHours( 7));
            default:
                return new DateTimeOffset(dateTime, TimeSpan.FromHours( 8)); ;
        }
    }
  

Затем Redis кэшировал значение как «2014-09-19T14:07:27.3870000 07:00»( 2 часа дня 7). Последующий запрос будет получен из кэшированного значения Redis, и приложение .NET автоматически преобразуется в местное время приложения, которое превращается в «2014-09-19 15:07:27.387» (3 часа дня, местное время приложения смещено на 8) перед SerializeFn.

Количество часов datetime увеличилось на 1 час. Выходное значение из кэша, которое проходит через тот же SerializeFn, стало «2014-09-19T15:07:27.3870000 07:00»( 3 часа дня 7)

Дата и время из кэша для Indonesia 7 увеличились на часы из-за автоматического преобразования в .NET.

Можно ли в любом случае определить, откуда берутся источники в SerializeFn? Может кто-нибудь подсказать мне, правильно ли я поступаю? Заранее спасибо.

Ответ №1:

Найдено решение. Добавлен DeserializeFn для обработки данных из кэша. И ранее в коде была пропущена какая-то часть, из-за которой решение не работало.

         DateTimeOffset dto = JsonSerializer.DeserializeFromString<DateTimeOffset>(time);
        DateTime temp = new DateTime(dto.UtcDateTime.Ticks, DateTimeKind.Utc);
        return DateTimeZone.ConvertDateTimeZoneFromUTC(CommonFunction.GetDbCountryCode(), temp);