zona timezoneinfo now horaria findsystemtimezonebyid example different convert c# datetime timezone dst

c# - timezoneinfo - Convertir UTC DateTime a otra zona horaria



timezoneinfo c# (5)

Echa 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 DST vea el método TimeZoneInfo.IsDaylightSavingTime .

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

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

Gracias mark


La mejor manera de hacer esto es simplemente 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 problema es que el valor DateTime entrante puede no tener el tipo DateTimeKind.Local . Debe ser Utc , o Unspecified .


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 práctica de extensión de conversión 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");


Puede usar una función dedicada dentro de TimeZoneInfo si desea convertir un DateTimeOffset en otro DateTimeOffset:

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


// 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();