DateTime Json使用默认序列化程序从Web API返回

时间:2013-05-22 16:47:29

标签: asp.net asp.net-web-api

我知道这个问题多次被删除,我在这个哈希上阅读了很多帖子,但仍然感到困惑。

使用MVC4 / WebAPI,我有一个日期时间,只是创建为新的DateTime.Now。

我的WebAPI是这样的返回数据:

 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, new
            {
                data = sessionRecordSmalls,
                count = sessionRecordSmalls.Count,
                success = true
            });

其中sessionRecordsSmall的公共属性为DateTime。

当我查看VS调试器中的日期时,它现在显示为没有时区,因为DateTime不包含时区。

{10/6/2012 9:45:00 AM}

当我查看从服务器下载的内容时,我会在JSON中看到

2012-10-06T09:45:00

我认为T0意味着时区0,而不是100%肯定。我的JavaScript库将其解释为时区0,然后显示下载为GMT的实际日期(-9小时前为我)。

我的问题是,JSON下载了什么?这包括时区吗?我在这里错过了一些重要的步骤吗?

2 个答案:

答案 0 :(得分:44)

如果使用json.net进行序列化,请记住您可以指定DateTimeZoneHandling

WebApiConf.cs中的示例

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.DateTimeZoneHandling =Newtonsoft.Json.DateTimeZoneHandling.Local;

答案 1 :(得分:14)

日期时间2012-10-06T09:45:00,我们使用Web API和默认序列化程序在JSON中重现{/ 3}}格式。

实际上这就是所谓的the ISO 8601。提取物:

  

..单个时间点可以通过连接a来表示   完整的日期表达式,字母T作为分隔符,并且有效   时间表达。例如“2007-04-05T14:30”......

此格式没有时区信息。正如Combined date and time representations摘录中提到的那样:

  

ISO 8601中的时区表示为当地时间(使用   未指定的位置),UTC,或UTC的偏移量。如果没有UTC   关系信息以时间表示给出,时间是   假设是在当地时间。

换句话说,如果没有指定UTC的偏移量,则将其视为本地时间。

Time zone designators将在末尾Z延长

  

如果时间是UTC,请在没有时间的情况下直接添加Z.   空间。 Z是零UTC偏移的区域指示符。 “09:30 UTC”   因此表示为“09:30Z”或“0930Z”。 “14:45:15 UTC”会   是“14:45:15Z”或“144515Z”。

UTC时间也被称为“Zulu”时间,因为'Zulu'是'Z'的北约语音字母词。

因此,我们收到的日期时间是ISO 8601格式,被视为本地时区(最后没有Z,如此2012-10-06T09:45:00Z