Obtener DateTime Para Otra Zona Horaria Independientemente de la Zona Horaria Local


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

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

 DateTime.Now
 DateTime.UtcNow
 TimeZone.CurrentTimeZone

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

Author: Dave, 2009-01-14

6 answers

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

SOFTWARE\Microsoft\Windows NT\CurrentVersion\Zonas horarias

Contiene subclaves para todas las zonas horarias. El valor del campo TZI contiene todas las propiedades de transición y sesgo para una zona horaria, pero todo está relleno en una matriz binaria. Los bits más importantes (sesgo y luz diurna), 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

 8
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-20 11:49:19

En. NET 3.5, hay TimeZoneInfo, que proporciona una gran cantidad de 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.

Así que 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.

 81
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-13 22:46:15

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

Esto permite encontrar una zona horaria por su nombre, en caso de que los Estados Unidos alguna vez floten 15 grados oeste o este desde el 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.");
}
 6
Author: Christopher Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-13 22:50:00

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

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

 2
Author: Robert C. Barth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-13 23:14:49

¿Qué tal

 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 fechas de primavera y otoño para la hora del Este para los próximos 50 años.. Eso es sólo 300 bytes más o menos... y luego indícalo para determinar si es el horario de verano en la costa este... Como se señaló, no te importa si es hora 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
   }
 1
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-13 22:52:47

Una comparación de fechas es una comparación de fechas. DateTime simplemente envuelve una estructura de memoria que se define en ticks y hace que los métodos para acceder a las partes de uso común de la memoria, por ejemplo, día o año o Hora o TimeOfDay, etc.

Además, la conversión solo es posible si conoce las compensaciones de destino snd de origen y luego el cálculo es siempre como se da es dado por -1 * (sourceOffset - destOffset)

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

Por favor también véase

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

 0
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:54