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 Kind
valeurs. 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 Now
ou UtcNow
.
En interne, la date est stockée en tant Ticks
que (contrairement à la réponse de @Carl Camera) est différente selon que vous utilisez Now
ou UtcNow
.
DateTime.UtcNow
se comporte comme les autres langues. Il définit Ticks
une valeur basée sur GMT. Il se met également Kind
à Utc
.
DateTime.Now
modifie la Ticks
valeur à 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 Kind
et 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 DateTime
instance, 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 Timespan
aurait é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 Kind
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 chacun. Vous devez toujours essayer de travailler avec des DateTime
objets 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.