#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);