La risposta di Antartica funziona solo per i fusi orari corrispondenti a UTC. Sono abbastanza traumatizzato con questa funzione DateTimeOffset
e dopo ore di tentativi ed errori, sono riuscito a produrre una pratica funzione di estensione di conversione che funziona con tutti i fusi orari.
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);
}
}
Esempio:
var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
devo fare un passo in più per ottenere la mia ora locale: var offset = tzi.GetUtcOffset (UTCTime); var siteLocalTime = utcTime.Add (offset); return siteLocalTime.ToString ("MM/gg/aaaa HH: mm"); –
Questo codice non viene compilato. L'ID del fuso orario non esiste e se lo si sostituisce con uno valido, si ottiene un errore relativo a "L'offset UTC per le istanze Date Utc di Utc deve essere 0". –
per evitare errori in dateAndOffset scegliere DateTime cstTime = utcTime.AddTicks (southPole.BaseUtcOffset.Ticks); –