2010-03-30 32 views
23

Tengo un valor UTC DateTime procedente de un registro de base de datos. También tengo un huso horario especificado por el usuario (una instancia de TimeZoneInfo). ¿Cómo convierto ese UTC DateTime a la zona horaria local del usuario? Además, ¿cómo puedo determinar si el huso horario especificado por el usuario actualmente está observando DST? Estoy usando .NET 3.5.Convertir UTC DateTime a otra zona horaria

Gracias, Marcos

Respuesta

20

Eche un vistazo a la estructura DateTimeOffset:

// user-specified time zone 
TimeZoneInfo southPole = 
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time"); 

// an UTC DateTime 
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc); 

// DateTime with offset 
DateTimeOffset dateAndOffset = 
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime)); 

Console.WriteLine(dateAndOffset); 

Para ver el horario de verano el método TimeZoneInfo.IsDaylightSavingTime.

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow); 
+0

tengo que ir un paso más para conseguir mi horario local: var offset = tzi.GetUtcOffset (UTCTime); var siteLocalTime = utcTime.Add (desplazamiento); return siteLocalTime.ToString ("MM/dd/aaaa HH: mm"); –

+5

Este código no se compila. Esa Id. De zona horaria no existe y si la reemplaza por una válida, se obtiene un error sobre 'El desplazamiento de UTC para las instancias de Utc DateTime debe ser 0'. –

+0

para evitar el error en dateAndOffset, elija DateTime cstTime = utcTime.AddTicks (southPole.BaseUtcOffset.Ticks); –

11

La respuesta de Antartica solo funciona para las zonas horarias que coinciden con UTC. Estoy bastante traumatizado con esta función DateTimeOffset y después de horas de prueba y error, he logrado producir una función de extensión de conversión práctica que funciona con todas las zonas horarias.

static public class DateTimeFunctions 
{ 
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc) 
    { 
     if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc"); 
     var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime); 
     var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified); 
     return new DateTimeOffset(convertedTime, toUtcOffset); 
    } 
} 

Ejemplo:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time"); 
+5

'static public' HEREJÍA, QUEMAR LA BRUJA –

20

Usted puede utilizar una función específica dentro de TimeZoneInfo si desea convertir un DateTimeOffset en otro DateTimeOffset:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 
); 
24

La mejor manera de hacer esto es simplemente para usar TimeZoneInfo.ConvertTimeFromUtc.

// you said you had these already 
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0); 
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 

// it's a simple one-liner 
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi); 

El único inconveniente es que el valor de entrada DateTime puede no tener el tipo DateTimeKind.Local. Debe ser Utc o Unspecified.

0
 // TO get Currrent Time in current Time Zone of your System 

     var dt = DateTime.Now; 

     Console.WriteLine(dt); 

     // Display Time Zone of your System 

     Console.WriteLine(TimeZoneInfo.Local); 

     // Convert Current Date Time to UTC Date Time 

     var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local); 

     Console.WriteLine(utc); 

     // Convert UTC Time to Current Time Zone 

     DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local); 

     Console.WriteLine(pacific); 

     Console.ReadLine(); 
Cuestiones relacionadas