C'est une bonne question. Je le relance pour donner un peu plus de détails sur la façon dont .Net se comporte avec différentes Kindvaleurs. Comme le souligne @Jan Zich, il s'agit en fait d'une propriété extrêmement importante et définie différemment selon que vous utilisez Nowou UtcNow.
En interne, la date est stockée en tant Ticksque (contrairement à la réponse de @Carl Camera) est différente selon que vous utilisez Nowou UtcNow.
DateTime.UtcNowse comporte comme les autres langues. Il définit Ticksune valeur basée sur GMT. Il se met également Kindà Utc.
DateTime.Nowmodifie la Ticksvaleur à ce qu'elle serait si c'était votre heure dans le fuseau horaire GMT . Il se met également Kindà Local.
Si vous avez 6 heures de retard (GMT-6), vous obtiendrez l'heure GMT d'il y a 6 heures. .Net ignore Kindet traite cette fois comme si c'était il y a 6 heures, même si c'est censé être "maintenant". Cela se brise encore plus si vous créez une DateTimeinstance, puis modifiez votre fuseau horaire et essayez de l'utiliser.
Les instances DateTime avec différentes valeurs 'Kind' ne sont PAS compatibles.
Regardons un peu de 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. La Timespanaurait été presque une heure, mais était presque 6. « utc <maintenant » aurait dû être vrai (j'ai même ajouté une heure pour être sûr), mais était encore faux.
Vous pouvez également voir le «contourner» qui consiste simplement à convertir en temps universel n'importe où qui Kindn'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 chacun. Vous devez toujours essayer de travailler avec des DateTimeobjets qui en ont Kind=Utc, sauf pendant les E / S (affichage et analyse). Cela signifie que vous devriez presque toujours l'utiliser DateTime.UtcNow, sauf dans les cas où vous créez l'objet juste pour l'afficher et le jeter immédiatement.