去掉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

太多了!

去掉servicestack.text-json-de/serialization中的时区部分

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)联系在一起……因为最大的问题是从"你的"时区转换到不同的时区——你不想去那里。

所以基本上:

  1. 你在服务器上所做的一切,都可以使用DateTime.UtcNow。如果你有一些日志只适合你,而且你真的想把它放在服务器的任何时区。。。当然,去吧。只要记住我说过的话,当你在半个地球上旅行时,需要看看日志。

  2. 如果客户端正在向服务器发送日期(即无法执行DateTime.UtcNow),请将他发送的内容转换为UTC并保存到数据库。当然"将客户发送的内容转换为UTC"说起来容易做起来难,但像这样的回答一次会有很大帮助。

  3. 如果要显示日期,请使用ServiceStack.Text序列化Json并设置JsConfig.DateHandler = DateHandler.ISO8601;&JsConfig.AssumeUtc = true;

  4. 在客户端上使用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";