摆脱servicestack.text json de / serialization中的时区部分?

时间:2013-07-26 19:15:29

标签: c# json datetime servicestack servicestack-text

你们知道如何从servicestack.text JsonSerializer的结果中消除TimeZone部分吗?它目前就像

  

2015-06-30T23:59:00.0000000 + 08:00

,我希望它是

  

2015-06-30T23:59:00.0000000

很多!

3 个答案:

答案 0 :(得分:3)

Service Stack可能正在做正确的事情。检查您要序列化的.Kind的{​​{1}}属性。如果您不想包含时区偏移,则它应为DateTime。我的猜测是你的值为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)));

答案 1 :(得分:3)

只是为了在这个主题上添加我的.02 $,因为我在过去几年里花了很长时间玩不同时区的系统。

基本上归结为永远不会使用DateTime.Now;总是使用DateTime.UtcNow。我已经创建了一个自定义组件,允许我使用DateTimeCustom.Now在特定时区给我现在(所以无论服务器上的时区是什么,我总能拥有"本地"时间);它在实践中起作用但最终我最终将它绑定到UTC(DateTimeCustom.Now = DateTime.UtcNow)...因为最大的问题是从"你的"转换到不同的时区。时区 - 你不想去那里。

基本上是这样的:

  1. 您在服务器上执行的所有操作都与DateTime.UtcNow一起使用。如果你有一些只适合你和你的日志,你真的想把它保存在服务器的任何时区......确定,去吧。只记得我在全球各地旅行时所说的内容,需要查看日志。

  2. 如果客户端正在向服务器发送日期(即无法执行DateTime.UtcNow),请将他发送的内容转换为UTC并将其保存到db。当然......"将客户端的内容转换为UTC"说起来容易做起来难,but answers like this once can help a lot

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

  4. 在客户端use AngularJs上,它可以轻松处理在本地时区显示日期/时间,例如{{myobj.mydate |日期:' HH:MM:SS'}}

答案 2 :(得分:1)

好的,问题解决了。它以2行代码结束:

JsConfig<DateTime>.SerializeFn = dt => dt.ToString("s");
JsConfig<DateTime?>.SerializeFn = dt => dt.HasValue ? dt.Value.ToString("s") : "null";