Question

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 traite pas des fuseaux horaires, mais quelqu'un peut-il expliquer en détail comment ils fonctionnent et lequel doit être utilisé dans quel scénario?

Était-ce utile?

La solution

DateTime.UtcNow vous indique la date et l'heure. l’heure, comme elle le serait en temps universel coordonné, également appelé fuseau horaire de la durée de Greenwich, comme si vous étiez à Londres en Angleterre, mais pas pendant l’été. DateTime.Now donne la date et l'heure telles qu'elles seraient apparaître à quelqu'un dans votre pays actuel.

Je recommanderais d'utiliser DateTime.Now chaque fois que vous affichez une date à 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 l'horloge. Utilisez DateTime.UtcNow lorsque vous souhaitez stocker des dates ou pour les calculs ultérieurs de cette manière (dans un modèle client-serveur), vos calculs ne sont pas confus par les clients situés dans des fuseaux horaires différents de votre serveur ou les uns des autres.

Autres conseils

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

Si vous n'utilisez pas Utc, vous devez connaître le fuseau horaire de la personne à qui vous affichez les dates et heures - sinon, vous lui direz que quelque chose s'est passé à 15 heures dans le système ou le serveur. temps, quand il est vraiment arrivé à 17 heures où ils vivent.

Nous utilisons DateTime.UtcNow parce que nous avons un public mondial et que je préfère ne pas obliger tous les utilisateurs à remplir un formulaire indiquant leur fuseau horaire.

Nous affichons également les heures relatives (il y a 2 heures, 1 jour, etc.) jusqu'à ce que le message ait suffisamment vieilli pour que l'heure soit & "identique"! peu importe où vous vivez sur Terre.

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).

N'utilisez donc pas DateTime.Now pour les mesures de temps relatif.

Un des principaux concepts à comprendre dans .NET est que maintenant correspond à maintenant partout dans le monde, quel que soit le fuseau horaire dans lequel vous vous trouvez. Par conséquent, si vous chargez une variable avec DateTime.Now ou DateTime.UtcNow - l'affectation est identique. * Votre DateTime objet sait dans quel fuseau horaire vous vous trouvez et en tient compte, quelle que soit l'affectation.

L’utilité de TimeSpan est très utile pour calculer des dates dépassant les limites de l’heure. C'est-à-dire que, dans les endroits qui participent à l'heure d'été, il y a parfois 25 heures de midi à midi le jour suivant et parfois de 23 heures entre midi et midi le jour suivant. Si vous voulez déterminer correctement le nombre d’heures à partir des heures A et B, vous devez d’abord traduire chacune d’elles en équivalents UTC avant de calculer le DateTime.Now().

Cela est couvert par un article de blog que j'ai écrit , qui explique plus en détail DateTime.UtcNow() , et inclut un lien vers un article encore plus complet de MS sur le sujet.

* Clarification: l'une ou l'autre affectation stockera l'heure actuelle. Si vous deviez charger deux variables, l'une via String et l'autre via <=>, la différence <=> entre les deux serait de l'ordre de la milliseconde, et non des heures si vous êtes dans un fuseau horaire à quelques heures de GMT. Comme indiqué ci-dessous, l'impression de leurs <=> valeurs affichera différentes chaînes.

C'est une bonne question. Je le relance pour donner un peu plus de détails sur la manière dont .Net se comporte avec différentes Kind valeurs. Comme le souligne @Jan Zich, il s'agit en réalité d'une propriété extrêmement importante. Elle est définie différemment selon que vous utilisez Now ou UtcNow.

En interne, la date est stockée sous la forme Ticks qui (contrairement à la réponse de @Carl Camera) diffère selon que vous utilisez DateTime.UtcNow ou Utc.

DateTime.Now se comporte comme les autres langues. Il définit Local sur une valeur GMT. Il définit également DateTime sur Timespan.

Kind=Utc modifie la <=> valeur en valeur par rapport à l'heure qu'il était dans le fuseau horaire GMT . Il définit également <=> sur <=>.

Si vous êtes 6 heures en retard (GMT-6), vous obtiendrez l'heure GMT d'il y a 6 heures. .Net ignore réellement <=> et traite cette heure comme si c'était il y a 6 heures, même si elle est supposée être & "Maintenant &"; Cela se casse davantage si vous créez une instance <=>, puis changez votre fuseau horaire et essayez de l'utiliser.

Les instances DateTime avec différentes valeurs "Kind" 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 heures compatibles. <=> aurait dû durer presque une heure, mais au lieu de six. & "Utc & Lt; maintenant " aurait dû être vrai (j'ai même ajouté une heure pour être sûr), mais était toujours faux.

Vous pouvez également voir le "contournement" qui consiste à simplement convertir en heure universelle n'importe où où <=> n'est pas le même.

Ma réponse directe à la question est en accord avec la recommandation de la réponse acceptée sur le moment d'utiliser chacune d'elles. Vous devez toujours essayer de travailler avec <=> des objets dotés de <=>, sauf pendant les E / S (affichage et analyse). Cela signifie que vous devriez presque toujours utiliser <=>, sauf dans les cas où vous créez un objet 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 à votre heure locale. UtcNow signifie uniquement & "Soustraire mon fuseau horaire de l'heure &";;

.

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

Juste un petit ajout aux points mentionnés ci-dessus: la structure DateTime contient également un champ peu connu appelé Genre (du moins, je ne le savais pas depuis longtemps). Il s’agit essentiellement d’un indicateur 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 qu’elle indique avec quelles intentions la structure a été construite, elle influence également la manière dont les méthodes ToUniversalTime () et ToLocalTime () fonctionne.

Le " simple " La réponse à la question est:

DateTime.Now renvoie une valeur DateTime représentant l'heure système actuelle (dans le fuseau horaire dans lequel le système s'exécute). La propriété DateTime.Kind sera DateTimeKind.Local

.

DateTime.UtcNow renvoie une valeur DateTime représentant le temps universel coordonné (ou UTC) actuel, qui sera identique quel que soit le fuseau horaire du système. La propriété DateTime.Kind sera DateTimeKind.Utc

.

DateTime.UtcNow est une échelle temporelle continue à valeur unique, alors que DateTime.Now n’est ni continue ni à valeur unique. La principale raison est l'heure avancée, qui ne s'applique pas à UTC. Donc, UTC ne avance ni ne recule d'une heure, contrairement à l'heure locale (DateTime.Now). Et quand il saute en arrière, la même valeur de temps apparaît deux fois.

DateTime.UtcNow est une échelle de temps universel omettant l'heure d'été. Donc, UTC ne change jamais en raison de l'heure d'été.

Mais DateTime.Now n'est pas continu ou à valeur unique car il change en fonction de l'heure d'été. Ce qui signifie DateTime. Maintenant, la même heure peut se produire deux fois, laissant les clients dans un état confus.

Lorsque vous avez besoin d'une heure locale pour la machine sur laquelle votre application est exécutée (comme CEST pour l'Europe), utilisez Maintenant. Si vous voulez un temps universel - UtcNow. Tout dépend de vos préférences - créer probablement un site Web local / une application autonome que vous voudriez utiliser le temps dont dispose l'utilisateur - donc affecté par son paramètre de fuseau horaire - DateTime.Now.

N'oubliez pas que pour un site Web, il s'agit du réglage du fuseau horaire du serveur. Ainsi, si vous affichez l'heure de l'utilisateur, vous devez soit obtenir son fuseau horaire préféré et décaler l'heure (enregistrez simplement l'heure Utc dans la base de données, puis modifiez-la), ou indiquez qu'il s'agit de l'heure UTC. Si vous oubliez de le faire, l'utilisateur peut voir quelque chose comme: il y a 3 minus , puis une heure dans le futur:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top