SignalR 日期时间 IsoString 到 UTC

Posted

技术标签:

【中文标题】SignalR 日期时间 IsoString 到 UTC【英文标题】:SignalR datetime IsoString to UTC 【发布时间】:2014-12-11 11:08:09 【问题描述】:

我正在通过 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:00Z

【问题讨论】:

【参考方案1】:

SignalR 使用来自 GlobalHost 对象的已注册 JsonSerializer。 添加以下内容,而不是您正在执行的操作;

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

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

【讨论】:

应该在哪里设置?我有同样的问题,我在客户端收到的时间是准确的服务器时间【参考方案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 在日期时间 json 值的末尾包含一个“Z”(祖鲁语)。 Chrome (v44.x) 将没有 Z 的日期时间处理为 UTC,但 IE11 将日期时间视为本地而不是 UTC。将 Z 添加到 datetime json 值的末尾使处理在我的经验中保持一致。

【讨论】:

以上是关于SignalR 日期时间 IsoString 到 UTC的主要内容,如果未能解决你的问题,请参考以下文章

将 SignalR 的 ITransportHeartbeat 添加到 Autofac

如何将数据传递到 Signalr 集线器类

500 /signalr/negotiate 在 Azure 中部署的应用程序

signalR 背板是不是也共享连接?

SignalR - 使用访问令牌进行身份验证

使用 SignalR 的 Angular 2 TypeScript