我在服务器端代码c#.net4中使用SignalR。 在客户端我正在使用javascript。
当我从服务器调用客户端方法时,例如
Caller.ShowDate(DateTime.Now);
客户端javascript以字符串形式获取“2012-11-13T19:02:39.3386544 + 02:00”的值。
如何在javascript中将其用作日期?
答案 0 :(得分:4)
请记住,由于时区/客户端修改时钟等,客户端时间可能与服务器时间完全不同。这就是说:
C#:
Caller.ShowDate(DateTime.UtcNow);
JavaScript的:
myHub.client.ShowDate = function(d) {
var serverTime = new Date(d); // The Server Time in JavaScript
}
答案 1 :(得分:0)
如果你是使用IE8的不快乐的人,那么可以阅读下面的评论:
SignalR使用Json.Net库来(de)序列化数据。
.NET 4.5之前Json.NET使用了epoch-format(“/ Date(1198908717056)/”)然后开始使用ISO8601标准(“2012-03-19T07:22Z”)[见Serializing Dates in JSON]
如果你想使用纪元格式,你需要重新配置json-serializator [见Replacing the IJsonSerializer]:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
var serializer = new JsonNetSerializer(new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
NullValueHandling = NullValueHandling.Ignore
});
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);
}
}
在客户端,您可以使用此代码将纪元时间转换为日期:
function epochUtcToDate(epochUtc) {
return new Date(parseInt(epochUtc.substr(6), 10));
};
答案 2 :(得分:0)
如果您要为Json日期添加时区,则需要使用服务器的本地时间
public class Startup
{
public void Configuration(IAppBuilder app)
{
GlobalHost.HubPipeline.AddModule(new ElmahPipelineModule());
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
var hubConfiguration = new HubConfiguration
{
};
map.RunSignalR(hubConfiguration);
});
var jsonSerializer = new JsonSerializer();
jsonSerializer.DateFormatHandling = DateFormatHandling.IsoDateFormat;
jsonSerializer.DateTimeZoneHandling = DateTimeZoneHandling.Local;
jsonSerializer.NullValueHandling = NullValueHandling.Ignore;
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => jsonSerializer);
}
}