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");
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"); –
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'. –
para evitar el error en dateAndOffset, elija DateTime cstTime = utcTime.AddTicks (southPole.BaseUtcOffset.Ticks); –