1

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

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

, 我希望它是

2015-06-30T23:59:00.0000000

多谢!

4

3 回答 3

3

只是为了在这个主题上加上我的 .02 美元,因为在过去的几年里我花了相当长的时间来玩跨不同时区的系统。

基本上它归结为永远不要使用 DateTime.Now; 始终使用 DateTime.UtcNow。我制作了一个自定义组件,允许我拥有 DateTimeCustom.Now,它在特定时区给了我 Now(所以无论服务器上的时区是什么,我总是可以拥有“本地”时间);它在实践中有效,但最终我将它与 UTC(DateTimeCustom.Now = DateTime.UtcNow)联系起来......因为最大的问题是从“你的”时区转换为不同的时区 - 你不想去那里。

所以基本上:

  1. 您在服务器上执行的所有操作都使用 DateTime.UtcNow。如果您有一些仅适合您且仅适用于您的日志,并且您真的希望将其保存在服务器所在的任何时区……当然,去吧。只要记住我在你去半个地球旅行并且需要查看日志时所说的话。

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

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

  4. 在客户端使用 AngularJs,它将轻松处理在本地时区显示日期/时间,例如 {{myobj.mydate | 日期:'HH:mm:ss'}}

于 2014-03-27T23:14:04.360 回答
3

服务堆栈可能正在做正确的事情。检查您正在序列化的.Kind属性。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)));

我机器上的输出:

"2013-07-27T11:42:02.3711281-07:00"
"2013-07-27T18:42:02.4071518Z"
"2013-01-01T00:00:00.0000000"
于 2013-07-27T18:37:49.813 回答
1

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

JsConfig<DateTime>.SerializeFn = dt => dt.ToString("s");
JsConfig<DateTime?>.SerializeFn = dt => dt.HasValue ? dt.Value.ToString("s") : "null";
于 2013-07-27T18:22:18.747 回答