zona timezoneinfo horaria example converttimefromutc cambiar c# .net

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;

Documentación de MSDN


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