ServiceStack - 来自Cache的DateTime SerializeFn与Database不同

时间:2014-06-23 09:35:46

标签: servicestack servicestack.redis

在我的Servicestack应用程序中,我正在尝试将Datetime从数据库序列化为RFC3339标准。 存储在数据库中的日期时间是本地时间。对于我的应用程序,数据库位于2个不同的位置,一个是印度尼西亚,+ 7偏移,另一个是马来西亚,+ 8偏移。两个数据库分别以本地时间存储。

相同的应用程序用于从不同位置为两个数据库提供服务。申请的当地时间是偏移+8 ,位于马来西亚。

当日期时间来自印度尼西亚数据库时,例如“2014-09-19 14:07:27.387”(下午2点),我会将偏移+7附加到“2014- 09-19T14:07:27.3870000 + 07:00" (2 pm+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 pm +7)。后续请求将从Redis缓存值获得,.NET应用程序将自动转换为应用程序本地时间,变为“2014-09-19 15:07:27.387”(下午3点,应用程序当地时间为在SerializeFn之前偏移+8)。

日期时间增加了1小时。来自同一个SerializeFn的缓存的输出值已变为“2014-09-19T15:07:27.3870000 + 07:00”(3 pm +7)

由于.NET中的自动转换,来自印度尼西亚+7的缓存的日期时间增加了几个小时。

无论如何要确定SerializeFn中的来源是什么?如果我以正确的方式做事,任何人都可以指导我吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

找到解决方案。添加了DeserializeFn以处理来自缓存的数据。以前有一部分错过了代码更改导致解决方案无法正常工作。

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