c# - specifykind - datetime utcnow tolocaltime()
¿Cuál es la diferencia entre DateTime.UtcNow y DateTime.Now.ToUniversalTime() (5)
Para mí ambos son iguales. ¿Es UtcNow simplemente un atajo?
Bueno, la implementación real es (se puede ver en la referencesource de referencesource ):
public static DateTime Now {
get {
Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Local);
DateTime utc = UtcNow;
Boolean isAmbiguousLocalDst = false;
Int64 offset = TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(utc, out isAmbiguousLocalDst).Ticks;
long tick = utc.Ticks + offset;
if (tick>DateTime.MaxTicks) {
return new DateTime(DateTime.MaxTicks, DateTimeKind.Local);
}
if (tick<DateTime.MinTicks) {
return new DateTime(DateTime.MinTicks, DateTimeKind.Local);
}
return new DateTime(tick, DateTimeKind.Local, isAmbiguousLocalDst);
}
}
ToUniversalTime()
llama a TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime)
mientras que UtcNow es justo:
long ticks = 0;
ticks = GetSystemTimeAsFileTime();
return new DateTime( ((UInt64)(ticks + FileTimeOffset)) | KindUtc);
Creo que usar DateTime.UTCNow consideraría el valor de la propiedad DateTime.Kind como UTC mientras que con ToUniversalTime puede proporcionar la propiedad Kind con un objeto local de fecha y hora.
Hay un largo ejemplo en la Documentación para UtcNow que muestra que son iguales.
No es un acceso directo, DateTime.Now usa DateTime.UtcNow internamente y luego aplica la localización. En resumen, use ToUniversalTime () si ya tiene DateTime.Now y necesita convertirlo a UTC, use DateTime.UtcNow si solo desea recuperar la hora actual en UTC.
En realidad es al revés. La propiedad Now
se implementa como:
public static DateTime Now {
get {
return UtcNow.ToLocalTime();
}
}