2010-09-01 4 views
2

Un utilisateur entre une date dans un formulaire, mais lorsque je transmets une date via un appel AJAX json, ma date est modifiée par le DataContractJsonSerializer.DataContractJsonSerializer modification de ma date

Voici mon appel AJAX:

function Save() 
{ 
    //Convert date to milliseconds from from 1/1/1970 - necessary for passing a date through JSON 
    var d = "09/01/2010 05:00"; 
    myDate = new Date(d); 
    myTicks = myDate.getTime(); 

    var message = 
    { 
     MessageID: $("#MessageID").val(), 
     MessageDate: '\/Date(' + myTicks + ')\/', 
    }; 

    $.ajax({ 
     url: "<%= Url.Action("SaveMessage") %>", 
     type: "POST", 
     dataType: "json", 
     data: $.toJSON(message), 
     contentType: "application/json; charset=utf-8", 
     success: function(result) 
     { 
      if (result && result.success) 
      { 
       // 
      } 
     } 
    }); 
} 

Voici mon code de sérialisation:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) 
    { 
     var serializer = new DataContractJsonSerializer(RootType); 

     filterContext.ActionParameters[Param] = serializer.ReadObject(filterContext.HttpContext.Request.InputStream); 
    } 
} 

Il change mes dates à l'heure GMT. Donc, si l'utilisateur entre "09/01/2010 05:00", après la sérialisation, il sort "09/01/2010 09:00".

J'ai été en mesure de résoudre ce problème dans mon environnement local en utilisant la fonction ci-dessous, mais cela ne fonctionne pas en production. Dans mon environnement local, l'heure du serveur est définie sur EST (11h00). En production, l'heure du serveur est définie sur GMT (15:00).

Voici ma fonction de conversion:

public DateTime ConvertToLocal(DateTime dt) 
{ 
    int hours = TimeZoneInfo.Local.GetUtcOffset(dt).Hours; 

    DateTime dtGMT = dt.AddHours(Convert.ToDouble(hours)); 

    return dtGMT; 
} 

Cela changera correctement ma date de "09/01/2010 09:00" Retour à "09/01/2010 05:00" sur mon environnement local, mais sur production il reste comme "09/01/2010 09:00 AM".

Il semble que dans la production, le DataContractJsonSerializer se rend compte que je navigue depuis EST, donc il ajoute 4 heures. Mais comme mon serveur de production est en GMT, mon ConvertToLocal ne fonctionne pas, le décalage de Timezone dans cette fonction est 0 au lieu de -4.

Que puis-je faire pour résoudre ce problème?

Répondre

5

Au lieu d'utiliser myTicks = myDate.getTime(); vous voulez probablement utiliser myTicks = myDate.UTC();

getTime() utilise l'heure locale (basé sur le fuseau horaire où le navigateur est en cours d'exécution). UTC() vous donne aussi des millisecondes depuis le 1er janvier 1970, mais c'est le 1er janvier 1970 UTC au lieu de l'heure locale. La sérialisation JSON des dates de Microsoft utilise la mesure UTC.

Ensuite, vous ne devriez pas avoir besoin de faire une conversion côté serveur.

+0

Merci, cela fonctionne parfaitement. – Steven

Questions connexes