Je commence juste à réfléchir correctement à la déploiement d'une webApp qui devra faire des choses aux utilisateurs au début de leur journée, disant 6 heures du matin. Aussi à la fin de leurs jours. P>
partout où j'ai lu sur les gens en disant beaucoup d'utiliser simplement à utiliser .Touniversaltime pour stocker l'heure en UTC, mais quand j'ai essayé ceci (comme je soupçonnais) cela n'a pas fonctionné, et cela vient de déplacer le temps à propos de Une heure (je suis au Royaume-Uni, j'ai donc pensé que c'était de faire avec une certaine compensation de GMT à l'UTC, bien que cela n'a pas de sens pour moi, car le jour de la lumière sauvegarde devrait être éteint pour le moment). P >
J'ai un champ dans la base de données qui stocke le fuseau horaire des utilisateurs, et donc quand j'ai commencé à utiliser ConvertiMeToutC et de Fromutc, cela a commencé à faire ce que je m'attendais à faire. Bien que je ne suis pas sûr que je ne suis pas sûr de construire dans une logique moi-même de faire des conversions d'économie de jour, ou cela devrait le faire pour moi. P>
Je me demande principalement pourquoi tout le monde parlait de .Touniversaltime, car il ne semblait vraiment pas m'aider, et je ne pouvais pas comprendre comment cela pourrait éventuellement savoir combien de compenser le temps de le transférer à UTC, tandis que la deuxième façon a eu un sens. p>
Quelqu'un pourrait-il expliquer comment chaque méthode pourrait être utile? p>
3 Réponses :
Si vous exécutez le code sur une machine dans une autre fuseau horaire, vos calculs vont-ils toujours fonctionner? C'est la raison pour laquelle les gens stockent et traitent tous les DateTimes comme UTC - il supprime toute ambiguïté. Vous n'avez pas besoin de stocker le fuseau horaire de l'utilisateur. Toute machine, n'importe où, peut tirer une date de la base de données et la convertir à partir de l'heure locale avec facilité. P>
Si vous stockez des horaires dans un autre fuseau horaire, vous devez le retirer, calculer le décalage sur le fuseau horaire souhaité, y compris l'affacturage des temps d'épargne de la lumière du jour et des considérations internationales de quart de données. Dans votre cas, vous stockez également des informations supplémentaires inutiles. P>
Et voir une autre réponse de Womp pour plus de détails: Stackoverflow.com/questions/1201378/... .
Edit: J'avais tort. Voir Matt Johnson's Répondre pour une explication des différences subtiles entre les implémentations de Pour quelqu'un d'autre qui a la question spécifique figurant dans le titre: Quelle est la différence entre DateTime.TouniversalTime et TimezoneInfo.ConvertiMeToutc strong>? P> La réponse est la suivante: Utilisation de justdecompile pour inspecter la mise en œuvre de DateTime.TouniversalTime code> et < Code> TimezoneInfo.convertiMeToutC Code>.
DateTime.Touniversaltime code> in .NET 4.5, nous voyons qu'il utilise
trimzoneinfo.convertimetoutc code> directement: p>
Diffusez avec Microsoft Documentation: msdn.microsoft.com/ fr-US / Bibliothèque / BB397769 (v = vs.110) .aspx Voir la deuxième "note"
Merci d'avoir fait remarquer cela. J'ai mis à jour une référence à la réponse de Matt Johnson qui explique les différences.
là en fait est em> une différence entre ces deux. in .NET 3.5 et inférieur fort>, car il a utilisé la classe code> TimeZone code>, il a subi les mêmes problèmes mentionnés dans Le MSDN Docs : P> Le classement code> TimeZone code> ne prend en charge qu'une seule règle de réglage de l'heure d'été pour le fuseau horaire local. En conséquence, la classe code> TimeZone CODE> peut signaler avec précision les informations de temps d'économie de jour ou convertir entre UTC et l'heure locale uniquement pour la période dans laquelle la dernière règle d'ajustement est en vigueur. En revanche, la classe code> TimeZoneInfo CODE> prend en charge plusieurs règles de réglage, ce qui permet de travailler avec des données de fuseau horaire historiques. P>
BlockQuote> in .NET 4.0 et supérieur STROND>, datetime.touniversaltime est mis en œuvre comme suit: p>
DateTime.TouniversalTime est implémenté comme suit: p>
DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt); // throws exception!
Console.WriteLine(utc);