去掉servicestack.text-json-de/serialization中的时区部分
本文关键字:时区 serialization servicestack text-json-de 去掉 | 更新日期: 2023-09-27 18:25:02
你们知道如何从servicestack.text JsonSerializer的结果中删除TimeZone部分吗?它现在就像
2015-06-30T23:59:00.0000000000+08:00
,我希望它是
2015-06-30 t23:59:00000000
太多了!
Service Stack可能做了正确的事情。检查正在序列化的DateTime
的.Kind
属性。如果您不希望包含时区偏移,那么它应该是DateTimeKind.Unspecified
。我的猜测是,您的值具有DateTimeKind.Local
,所以它正在捕获您的本地偏移。
考虑以下代码:
JsConfig.DateHandler = JsonDateHandler.ISO8601;
Debug.WriteLine(JsonSerializer.SerializeToString(DateTime.Now));
Debug.WriteLine(JsonSerializer.SerializeToString(DateTime.UtcNow));
Debug.WriteLine(JsonSerializer.SerializeToString(new DateTime(2013, 1, 1)));
我机器上的输出:
"2013-07-27T11:42:02.3711281-07:00"
"2013-07-27T18:42:02.4071518Z"
"2013-01-01T00:00:00.0000000"
只是想在这个话题上添加我的.02$,因为在过去的几年里,我花了相当长的时间来玩跨越不同时区的系统。
基本上,它可以归结为从不使用DateTime。现在;始终使用DateTime.UtcNow。我制作了一个自定义组件,允许我使用DateTimeCustom。现在,它使我可以使用特定时区的Now(因此,无论服务器上的时区是什么,我都可以使用"本地"时间);它在实践中起到了作用,但最终我把它与UTC(DateTimeCustom.Now=DateTime.UtcNow)联系在一起……因为最大的问题是从"你的"时区转换到不同的时区——你不想去那里。
所以基本上:
-
你在服务器上所做的一切,都可以使用DateTime.UtcNow。如果你有一些日志只适合你,而且你真的想把它放在服务器的任何时区。。。当然,去吧。只要记住我说过的话,当你在半个地球上旅行时,需要看看日志。
-
如果客户端正在向服务器发送日期(即无法执行DateTime.UtcNow),请将他发送的内容转换为UTC并保存到数据库。当然"将客户发送的内容转换为UTC"说起来容易做起来难,但像这样的回答一次会有很大帮助。
-
如果要显示日期,请使用ServiceStack.Text序列化Json并设置
JsConfig.DateHandler = DateHandler.ISO8601;
&JsConfig.AssumeUtc = true;
-
在客户端上使用AngularJs,它可以轻松地在本地时区显示日期/时间,如{{myobj.mydate|date:'HH:mm:ss'}}
好的,问题解决了。它以两行代码结束:
JsConfig<DateTime>.SerializeFn = dt => dt.ToString("s");
JsConfig<DateTime?>.SerializeFn = dt => dt.HasValue ? dt.Value.ToString("s") : "null";