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