timezoneinfo - Obtenga la compensación de zona horaria del servidor en C#
timezoneinfo c# example (4)
Cuando contratas un nuevo objeto DateTime
obtiene DateTime.MinValue
Cuando obtienes su TimeZone.CurrentTimeZone.GetUtcOffset
, obtienes la compensación de tiempo para esa fecha. Si usa DateTime.Now
, obtendrá la fecha y hora actual y, por lo tanto, la compensación actual.
¿Cómo puedo obtener la compensación de zona horaria del servidor físico ejecutando mi código? No es un objeto de fecha u otro objeto en la memoria.
Por ejemplo, el siguiente código mostrará -4:00:00
:
<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>
Cuando debería ser -03:00:00
debido al horario de verano
Desde .NET 3.5, puede usar lo siguiente desde DateTimeOffset
para obtener el desplazamiento actual.
var offset = DateTimeOffset.Now.Offset;
Parece haber alguna diferencia entre cómo funciona GetUtcOffset
con el new DateTime()
y DateTime.Now
. Cuando lo ejecuto en la zona horaria central, obtengo:
TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00
TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now) // -05:00:00
Es un poco complicado, pero supongo que también podrías hacer esto:
DateTime.Now - DateTime.UtcNow // -05:00:00
new DateTime()
le dará el 1 de enero 0001, en lugar de la fecha / hora actual . Sospecho que quiere el desplazamiento UTC actual ... y es por eso que no está viendo el desplazamiento del horario de verano en su código actual.
TimeZoneInfo.Local
lugar de TimeZone.CurrentTimeZone
; puede que no afecte las cosas, pero definitivamente sería un mejor enfoque. TimeZoneInfo
debería reemplazar a TimeZone
en todo el código. Entonces puedes usar GetUtcOffset
:
var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);
(Usar DateTime.Now
debería funcionar también, pero implica algo de magia detrás de las escenas cuando hay transiciones de ahorro de luz del día. DateTime
realidad tiene cuatro tipos en lugar de los tres anunciados , pero es más simple simplemente evitar el problema usando UtcNow
.)
O, por supuesto, podrías usar mi biblioteca Noda Time en lugar de toda esta basura de BCL;) (Si estás haciendo un montón de trabajo de fecha y hora, lo recomendaría a fondo, obviamente, pero si solo estás haciendo esto un poco , probablemente sería excesivo.)