Sérialisation de date JSON et fuseaux horaires
Je vais avoir des problèmes d'affichage de la date sur le navigateur du client à l'aide d'un JSON objet sérialisé. L'utilisateur est en mesure de définir quelle heure de la zone afficher les données. Compte tenu de cela, je convertir la date UTC pour le temps de l'utilisateur de la zone sur le serveur. Ensuite, je veux sérialiser la date/temps (qui sont déjà convertis à la définition de leurs fuseau horaire) pour le navigateur via JSON.
Semble simple, mais le JSON sérialiseurs j'ai été en utilisant ont été gravement marinage vers le haut de mes dates. Le serveur est en UTC et le client est au centre de la (-6). Les dates sont ajustées (à 12 heures), même si je suis en précisant le type DateTime.Genre non spécifié.
En quelque sorte .NET ne sait quel fuseau horaire le navigateur du client est au et fuseau horaire, le serveur est en cours et il est la négation de -6 à partir de mes dates/heures, même si j'ai déjà réglé la fois par l'utilisateur paramètres et définissez les dates de' genre à être spécifiée. Comment puis-je obtenir le JSON sérialiseurs de ne PAS essayer de régler mes dates?
List<ErrorGridModel> models = Mapper.Map<ErrorCollection, List<ErrorGridModel>>(errors);
foreach (ErrorGridModel m in models)
{
//convert UTC dates to user local dateTime - split out date vs. time for grouping & splitting columns
DateTime dtLocal = TimeZoneInfo.ConvertTimeFromUtc(m.ErrorDate, this.AppContext.User.TimeZoneInfo);
m.ErrorDate = new DateTime(dtLocal.Year, dtLocal.Month, dtLocal.Day, 0, 0, 0, DateTimeKind.Unspecified);
m.ErrorTime = new DateTime(1900, 1, 1, dtLocal.Hour, dtLocal.Minute, dtLocal.Second, DateTimeKind.Unspecified);
}
IQueryable<ErrorGridModel> dataSource = models.AsQueryable();
return new ContentResult() { Content = JsonConvert.SerializeObject(dataSource.ToDataSourceResult(request), new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }), ContentType = "application/json" };
//return Json(dataSource.ToDataSourceResult(request));
ISO dates semblent fonctionner, mais je ne peux pas les utiliser comme je l'ai 3ème partie contrôle qui veulent le plus vieux format Microsoft... qui permet de régler l'heure les zones de sur-moi.
source d'informationauteur Bill Christenson
Vous devez vous connecter pour publier un commentaire.
Lorsque vous essayez de contrôler les décalages, ne comptez pas sur
DateTimeKind.Unspecified
. Il a quelques bizarreries qui sont souvent interprété commeUnspecified == Local
. La seule façon d'obtenir Json.Net spécifiquement pour coder le décalage correct (indépendamment de l'ISO ou de la MS format) est de passer unDateTimeOffset
au lieu d'unDateTime
.Maintenant, j'espère que vous trouverez que le javascript que vous utilisez des contrôles fera l'honneur de l'offset et de l'appliquer de façon appropriée. Si non, alors le reste du problème est spécifique à la commande que vous utilisez.
Ici est une longue discussion sur la situation exacte que j'ai été dans. http://www.telerik.com/community/forums/aspnet-mvc/grid/grids-and-dates.aspx
Bas de ligne, si vous utilisez Microsoft JSON format de la date, il sera toujours tenir compte de la date au format UTC comme le nombre de millisecondes (tiques) à partir de 1/1/1970 UTC. Il n'y a aucun moyen pour moi de conversion automatique de l'heure locale sur le serveur et d'envoyer ce qu'il devrait être en bas via JSON pour le Kendo Grille que le Kendo contrôle de Grille instancie la date à partir de tiques en JS que l'UTC. Lors de l'affichage de cette date, il sera automatiquement convertir la valeur du navigateur du fuseau horaire local.
La seule façon de montrer mon serveur est converti en valeur à la date du serveur est d'envoyer la date via JSON comme une chaîne de caractères pour le client.
Nous nous sommes heurtés à ce problème ainsi. Comme vous le notez, le problème qui se passe réellement sur le côté client. À l'aide d'un fin gestionnaire de votre grille, vous pouvez convertir la date de retour à l'UTC. Exemple ici:
http://www.kendoui.com/code-library/mvc/grid/using-utc-time-on-both-client-and-server-sides.aspx