0

在我的 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 点 + 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”(2pm+7)。后续请求将从 Redis 缓存值获取,.NET 应用程序将自动转换为应用程序本地时间,在 SerializeFn 之前变为“2014-09-19 15:07:27.387”(下午 3 点,应用程序本地时间偏移 +8) .

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

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

无论如何要确定 SerializeFn 中的来源在哪里?如果我以正确的方式做事,谁能指导我?提前致谢。

4

1 回答 1

1

找到解决方案。添加了 DeserializeFn 以处理缓存中的数据。以前有一些部分错过了代码更改导致解决方案不起作用。

        DateTimeOffset dto = JsonSerializer.DeserializeFromString<DateTimeOffset>(time);
        DateTime temp = new DateTime(dto.UtcDateTime.Ticks, DateTimeKind.Utc);
        return DateTimeZone.ConvertDateTimeZoneFromUTC(CommonFunction.GetDbCountryCode(), temp);
于 2014-06-24T00:56:47.623 回答