zona timezoneinfo horaria findsystemtimezonebyid example converttimefromutc cambiar c# datetime .net-2.0

c# - timezoneinfo - Obtenga DateTime para otra zona horaria independientemente de la zona horaria local



timezoneinfo c# example (6)

Independientemente de la zona horaria local del usuario, con C # (.NET 2.0) necesito determinar la hora (objeto DateTime) en la zona horaria del este.

Conozco estos métodos, pero no parece haber una forma obvia de obtener un objeto DateTime para una zona horaria diferente de la que tiene el usuario.

DateTime.Now DateTime.UtcNow TimeZone.CurrentTimeZone

Por supuesto, la solución debe tener en cuenta el horario de verano.


Desde: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

Esto permite que se encuentre una zona horaria por nombre, en caso de que EE. UU. Alguna vez flote 15 grados al oeste o al este del meridiano de Londres.

DateTime timeUtc = DateTime.UtcNow; try { TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); Console.WriteLine("The date and time are {0} {1}.", cstTime, cstZone.IsDaylightSavingTime(cstTime) ? cstZone.DaylightName : cstZone.StandardName); } catch (TimeZoneNotFoundException) { Console.WriteLine("The registry does not define the Central Standard Time zone."); } catch (InvalidTimeZoneException) { Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted."); }


En .NET 3.5, está TimeZoneInfo , que proporciona mucha funcionalidad en esta área; 2.0SP1 tiene DateTimeOffset , pero esto es mucho más limitado.

Obtener UtcNow y agregar un desplazamiento fijo es parte del trabajo, pero no es compatible con DST.

Entonces en 3.5 creo que puedes hacer algo como:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId( DateTime.UtcNow, "Eastern Standard Time");

Pero esto simplemente no existe en 2.0; lo siento.


Le ahorraré el tiempo y le diré que no hay forma en .net adecuada, versión 2.0 para obtener un objeto DateTime para otra zona horaria diferente a la que se ejecuta el software (que no sea UTC).

Sin embargo, eso no significa que no hay una manera de hacerlo fuera de .net. Eche un vistazo aquí en la clase TimeZoneInformation. Esta clase envuelve algunas cosas p / invoke al Win O / S para obtener la información de zona horaria del O / S. Lo utilicé con éxito cuando 2.0 era nuevo y funcionó muy bien. El sitio en el que estaba trabajando tenía que poder mostrar cada fecha / hora local al usuario y tenía que ser consciente de DST, y esta clase cumplió con la factura por nosotros.


Qué tal si

DateTime lclTime = DateTime.Now; DateTime ept = lclTime.ToUniversalTime().AddHours( IsEasternDaylightSavingTime( lclTime.ToUniversalTime())? -5: -4)

o si ya tiene UTC local, solo

DateTime lclUtc = DateTime.UtcNow; DateTime ept = lclUtc.AddHours( IsEasternDaylightSavingTime(lclUtc)? -5: -4)

Use el diccionario estático de valores codificados para las fechas Spring-forward y fall-down para Eastern time durante los próximos 50 años. Eso es solo 300 bytes más o menos ... y luego indexe eso para determinar si es horario de verano en la costa este. .. Como se señaló, no te importa si es el horario de verano en la zona local o no ...

private static bool IsEasternDaylightSavingTime(DateTime utcDateTime) { // hard coded method to determine // whether utc datetime is Eastern Standard time // or Eastern Daylight Time }


Como todos los demás mencionaron, .NET 2 no contiene ninguna información de zona horaria. La información se almacena en el registro, sin embargo, y es bastante trivial escribir una clase contenedora a su alrededor:

SOFTWARE / Microsoft / Windows NT / CurrentVersion / Time Zones

contiene subclases para todas las zonas horarias. El valor del campo TZI contiene todas las propiedades de transición y sesgo para una zona horaria, pero está todo relleno en una matriz binaria. Los bits más importantes (sesgo y luz del día) son int32s almacenados en las posiciones 0 y 8, respectivamente:

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0); int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8);

Esta página tiene un resumen razonable: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm


Una comparación de fecha es una comparación de fecha. DateTime solo envuelve una estructura de memoria que se define en tics y hace que los métodos para acceder a las partes comúnmente utilizadas de la memoria, por ejemplo, día o año o Time o TimeOfDay, etc.

Además, la conversión solo es posible si conoce los desfases de origen y destino y luego el cálculo siempre es el dado por -1 * (sourceOffset - destOffset)

Donde la parte entre paréntesis representa la diferencia de zona horaria.

Por favor, también vea

Obtener hora del este en c # sin convertir la hora local