DateTime.Now vs. DateTime.UtcNow

Je me suis demandé quels sont exactement les principes de fonctionnement des deux propriétés. Je sais que le second est universel et ne concerne essentiellement pas les fuseaux horaires, mais est-ce que quelqu’un peut expliquer en détail comment ils fonctionnent et lequel doit être utilisé dans quel scénario?

    DateTime.UtcNow vous indique la date et l’heure telles qu’elles seraient dans le temps universel coordonné, également appelé fuseau horaire de Greenwich Mean Time. DateTime.Now donne la date et l’heure telles qu’elles apparaîtront à quelqu’un dans votre environnement local actuel.

    Je vous recommande d’utiliser DateTime.Now chaque fois que vous affichez une date pour un être humain – de cette façon, ils sont à l’aise avec la valeur qu’ils voient – c’est quelque chose qu’ils peuvent facilement comparer à ce qu’ils voient sur leur montre ou leur horloge. Utilisez DateTime.UtcNow lorsque vous souhaitez stocker des dates ou les utiliser pour des calculs ultérieurs (dans un modèle client-serveur), vos calculs ne seront pas confondus par les clients situés dans des fuseaux horaires différents de votre serveur ou les uns des autres.

    C’est vraiment très simple, donc je pense que cela dépend de votre public et de leur lieu de résidence.

    Si vous n’utilisez pas Utc, vous devez connaître le fuseau horaire de la personne à laquelle vous affichez les dates et heures – sinon, vous leur direz que quelque chose s’est produit à 15 heures, heure du serveur ou du système. il leur arrive de vivre.

    Nous utilisons DateTime.UtcNow parce que nous avons une audience Web globale, et parce que je préfère ne pas harceler chaque utilisateur de remplir un formulaire indiquant le fuseau horaire dans lequel ils vivent.

    Nous affichons également les temps relatifs (il y a 2 heures, il y a 1 jour, etc.) jusqu’à ce que le message soit suffisamment vieux pour que l’heure soit “la même” peu importe où vous habitez sur Terre.

    Un des principaux concepts à comprendre dans .NET est que maintenant , vous êtes sur toute la terre, quel que soit le fuseau horaire dans lequel vous vous trouvez. Donc, si vous chargez une variable avec DateTime.Now ou DateTime.UtcNow – l’affectation est identique. object sait quel fuseau horaire vous êtes et prend cela en compte indépendamment de l’affectation.

    L’utilité de DateTime.UtcNow est pratique lorsque vous calculez des dates sur les limites de l’heure d’été. Autrement dit, dans les endroits qui participent à l’heure d’été, il y a parfois 25 heures de midi à midi le lendemain, et parfois il y a 23 heures entre midi et midi le lendemain. Si vous souhaitez déterminer correctement le nombre d’heures à partir de l’heure A et de l’heure B, vous devez d’abord les traduire en leurs équivalents UTC avant de calculer TimeSpan.

    Ceci est couvert par un article de blog que j’ai écrit qui explique plus en détail TimeSpan, et inclut un lien vers un article de MS encore plus complet sur le sujet.

    * Clarification: l’une ou l’autre des affectations stockera l’heure actuelle. Si vous deviez charger deux variables l’une via DateTime.Now () et l’autre via DateTime.UtcNow (), la différence TimeSpan entre les deux serait de millisecondes, et non d’heures en supposant que vous êtes dans un fuseau horaire de GMT. Comme indiqué ci-dessous, l’impression de leurs valeurs de chaîne afficherait différentes chaînes.

    Notez également la différence de performance; DateTime.UtcNow est environ 30 fois plus rapide que DateTime.Now, car en interne DateTime.Now effectue de nombreux ajustements de fuseau horaire (vous pouvez facilement le vérifier avec Reflector).

    Donc, n’utilisez pas DateTime.Now pour les mesures de temps relatives.

    C’est une bonne question. Je le réanime pour donner un peu plus de détails sur le comportement de .Net avec différentes valeurs «Kind». Comme le souligne @Jan Zich, c’est en fait une propriété d’une importance critique et est définie différemment selon que vous utilisez Now ou UtcNow.

    En interne, la date est stockée sous la forme “Ticks” (contrairement à la réponse de @Carl Camera) qui est différente selon que vous utilisez Now ou UtcNow.

    DateTime.UtcNow se comporte comme les autres langages. Il définit les ticks sur une valeur basée sur GMT. Il définit également ‘Kind’ à ‘Utc’.

    DateTime.Now modifie la valeur de Ticks à ce qu’elle serait si c’était l’heure de votre journée dans le fuseau horaire GMT . Il définit également ‘Kind’ à ‘Local’.

    Si vous avez 6 heures de retard (GMT-6), vous aurez l’heure GMT de 6 heures auparavant. .Net ignore réellement ‘Kind’ et traite cette fois comme si c’était il y a 6 heures, même si elle est supposée être “maintenant”. Cela se casse encore plus si vous créez une instance DateTime, puis modifiez votre fuseau horaire et essayez de l’utiliser.

    Les instances DateTime avec des valeurs ‘Kind’ différentes ne sont PAS compatibles.

    Regardons du code …

      DateTime utc = DateTime.UtcNow; DateTime now = DateTime.Now; Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local Debug.Log (utc.Ticks); // 635677391678617830 Debug.Log (now.Ticks); // 635677139678617840 now = now.AddHours(1); TimeSpan diff = utc - now; Debug.Log (diff); // 05:59:59.9999990 Debug.Log (utc < now); // false Debug.Log (utc == now); // false Debug.Log (utc > now); // true Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010 

    Comme vous pouvez le voir ici, les comparaisons et les fonctions mathématiques ne sont pas automatiquement converties en temps compatibles. Le Timespan aurait dû durer presque une heure, mais au lieu de cela, il était presque 6. “UTC

    Vous pouvez également voir le «travail autour de» qui consiste simplement à convertir en temps universel partout où «Kind» n’est pas la même chose.

    Ma réponse directe à la question est en accord avec la recommandation de la réponse acceptée concernant l’utilisation de chacun. Vous devriez toujours essayer de travailler avec les objects DateTime qui ont Kind = Utc, sauf pendant les E / S (affichage et parsing). Cela signifie que vous devriez presque toujours utiliser DateTime.UtcNow, à l’exception des cas où vous créez l’object uniquement pour l’afficher et le supprimer immédiatement.

    DateTime n’a aucune idée de ce que sont les fuseaux horaires. Cela suppose toujours que vous êtes à l’heure locale. UtcNow signifie seulement “Soustrayez mon fuseau horaire de l’heure”.

    Si vous souhaitez utiliser des dates compatibles avec les fuseaux horaires, utilisez DateTimeOffset , qui représente une date / heure avec un fuseau horaire. Je devais apprendre ça à la dure.

    Juste un petit ajout aux points ci-dessus: la structure DateTime contient également un champ peu connu appelé Kind (du moins, je ne le savais pas depuis longtemps). C’est simplement un drapeau indiquant si l’heure est locale ou UTC; il ne spécifie pas le décalage réel par rapport à UTC pour les heures locales. Outre le fait que cela indique avec quelles intentions le corps a été construit, cela influence également la façon dont fonctionnent les méthodes ToUniversalTime () et ToLocalTime () .

    La “simple” réponse à la question est:

    DateTime.Now renvoie une valeur DateTime représentant l’heure système actuelle (quel que soit le fuseau horaire dans lequel le système est exécuté). La propriété DateTime.Kind sera DateTimeKind.Local

    DateTime.UtcNow renvoie une valeur DateTime représentant l’heure universelle coordonnée (UTC) actuelle, qui sera la même quel que soit le fuseau horaire du système. La propriété DateTime.Kind sera DateTimeKind.Utc

    Un peu tard pour la fête, mais j’ai trouvé ces deux liens (4guysfromrolla) très utiles:

    Utilisation du temps universel coordonné (UTC) pour stocker les valeurs de date / heure

    Conseils pour stocker et afficher les dates et les heures dans différents fuseaux horaires

    DateTime.UtcNow est une échelle de temps continue à valeur unique, tandis que DateTime.Now n’est pas continue ou à valeur unique. La principale raison est l’heure avancée, qui ne s’applique pas à l’UTC. Donc, UTC ne saute jamais en avant ou en arrière d’une heure, contrairement à l’heure locale (DateTime.Now). Et quand il recule, la même valeur de temps se produit deux fois.

    Lorsque vous avez besoin d’une heure locale pour la machine sur laquelle votre application s’exécute (comme CEST pour l’Europe), utilisez Now. Si vous voulez un temps universel – UtcNow. Il ne s’agit que de vos préférences – en faisant probablement une application locale de site Web / autonome que vous souhaitez utiliser au moment où l’utilisateur a – ainsi affecté son paramètre de fuseau horaire – DateTime.Now.

    Rappelez-vous, pour un site Web, c’est le paramètre de fuseau horaire du serveur. Donc, si vous affichez l’heure pour l’utilisateur, récupérez son fuseau horaire préféré et changez l’heure (sauvegardez simplement l’heure de l’Utc à la firebase database, puis modifiez-la) ou spécifiez son UTC. Si vous oubliez de le faire, l’utilisateur peut voir quelque chose comme: posté 3 minutes plus tôt , puis une date future proche 🙂