SignalR datetime Iso String to UTC

时间:2014-12-11 11:08:10

标签: json datetime signalr jsonserializer

我通过SignalR从ServerSide发送一个没有未指定类型的DateTime对象:

myDate.Kind //Unspecified

我按照建议here设置JsonConvert defaultSettings使用UTC:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings(){
      DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

如果我使用JsonConvert.SerializeObject,我获得UTC ISO8601格式的字符串,后缀为“Z”:

JsonConvert.SerializeObject(myDate) // "\"2014-11-27T23:00:00Z\""

但是,如果我通过SignalR发送对象,则在客户端我收到:

myDate: "2014-11-27T23:00:00" 

请注意,它返回时没有Z后缀。

SignalR没有使用JsonConvert吗? 为什么我得到两个不同的结果?

我的目标是接待客户方:“2014-11-27T23:00:00 Z

2 个答案:

答案 0 :(得分:5)

SignalR使用GlobalHost对象中注册的JsonSerializer。 而不是你在做什么,添加以下内容;

 var serializer = new JsonSerializer()
 {
     DateTimeZoneHandling = DateTimeZoneHandling.Utc
 };
 GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);

不要忘记(如果需要)设置Null处理,引用处理等

答案 1 :(得分:2)

更新SignalR 2.2.0的答案,并提供一些信息放置代码,我将此代码放在Global.asax.cs中:

{ ... other using ... }
using Newtonsoft.Json;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Json;

public class MvcApplication : System.Web.HttpApplication
{

    protected void Application_Start()
    {
        { ... other code ... }

        /* Need to using UTC time for SignalR so IE and Chrome display dates correctly 
         * (append Z (Zulu) onto end of json timestamps) */
        var settings = JsonUtility.CreateDefaultSerializerSettings();
        settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
        var serializer = JsonSerializer.Create(settings);
        GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
    }

    { .. more code .. }
}

这是必需的,因此SignalR包括" Z" (祖鲁语)在datetime json值结束时。 Chrome(v44.x)处理没有Z作为UTC的日期时间,但IE11将日期时间视为本地而不是UTC。将Z添加到datetime json值的末尾使得处理在我的经验中保持一致。