【问题标题】:SignalR datetime IsoString to UTCSignalR 日期时间 IsoString 到 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

【问题讨论】:

    标签: json datetime signalr jsonserializer


    【解决方案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 值的末尾使处理在我的经验中保持一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 2012-10-29
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多