首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ServiceStack -有没有办法强制所有序列化的日期使用特定的DateTimeKind?

ServiceStack -有没有办法强制所有序列化的日期使用特定的DateTimeKind?
EN

Stack Overflow用户
提问于 2013-10-31 05:51:58
回答 3查看 9.2K关注 0票数 18

我有一个这样的POCO:

代码语言:javascript
复制
public class BlogEntry
{
    public string Title { get; set; }
    public DateTime Date { get; set; }
}

大多数时候,它是从实体框架中得到补充的,但它可以并将在实体框架之外使用。

来自EF的日期的DateTimeKind未指定,从我读取的内容来看,这是正常的。

当我在Redis中缓存这个POCO时(使用ServiceStack Redis客户端),它返回一个DateTimeKind为Local。

所以返回的对象会有抖动。第一次传递(未缓存)的ISO-8601没有偏移量(DateTimeKind.Unspecified)。第二遍(缓存)是带有偏移量的ISO-8601 (从带有DateTimeKind.Local的Redis )。

有没有办法强制ServiceStack JSON序列化程序始终将日期解释为给定的DateTimeKind?(我知道有一个"JsConfig.AppendUtcOffset“属性,但是不管它是真是假,这些值对我来说永远不会改变?)

或者在我的类型化RedisClient的反序列化过程中的某个地方,使DateTimeKind成为本地的?

我可以手动更改我的POCO来强制执行DateTimeKind -这很有效-但我希望有一些不太容易出错的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-31 21:53:03

如果你需要比@mythz的答案更具可配置性的东西,你可以强制DateTimes的序列化或反序列化具有特定的DateTimeKind,方法是覆盖DateTime和可选的DateTime?序列化和/或反序列化方法。

强制将所有序列化的DateTimes解释为UTC

代码语言:javascript
复制
JsConfig<DateTime>.SerializeFn = time => new DateTime(time.Ticks, DateTimeKind.Local).ToString();

然后,您可以更进一步,如果DateTime未采用指定的格式,则会在反序列化时出错。当我想强制客户端在所有请求中指定时区,但不一定要求它始终为Utc时,我就开始使用它。

代码语言:javascript
复制
JsConfig<DateTime>.DeSerializeFn = time =>
{
  if (!IsInCorrectDateFormat(time))
    throw new System.Runtime.Serialization.SerializationException(BadDateTime);

  return ServiceStack.Text.Common.DateTimeSerializer.ParseDateTime(time);
};
票数 21
EN

Stack Overflow用户

发布于 2013-10-31 09:32:07

DateTimeKind偏移量不会与日期一起存储,因此在默认情况下,ServiceStack序列化程序假定日期是本地的,该日期被序列化为协调时,并反序列化为本地。

您可以使用以下命令将DateTimeKind.Unspecified假定为UTC:

代码语言:javascript
复制
JsConfig.AssumeUtc = true;
票数 7
EN

Stack Overflow用户

发布于 2015-06-05 00:20:11

对bpruitt-goddard解决方案的调整。一切功劳都归功于他。

代码语言:javascript
复制
JsConfig<DateTime>.SerializeFn = time => new DateTime(time.Ticks, DateTimeKind.Local).ToString("o");
        JsConfig<DateTime?>.SerializeFn = 
            time => time != null ? new DateTime(time.Value.Ticks, DateTimeKind.Local).ToString("o") : null;
        JsConfig.DateHandler = DateHandler.ISO8601;

因此,从服务堆栈传出的任何日期都将被强制转换为ISO8601日期格式,而传入的任何日期将自动从ISO8601字符串转换为C#日期。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19694475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档