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?
Merci, cela fonctionne parfaitement. – Steven