datetime para string com fuso horário

Eu tenho um DateTime armazenado no horário universal (UTC) de valor 2010-01-01 01:01:01 .

Eu gostaria de exibi-lo em EST neste formato 2010-01-01 04: 01: 01GMT-04: 00 , no entanto, o ‘K’ formatador para fuso horário não funciona em ToString

Use o especificador de formato “zzz” para obter o deslocamento UTC. Por exemplo:

var dt = new DateTime(2010, 1, 1, 1, 1, 1, DateTimeKind.Utc); string s = dt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz"); Console.WriteLine(s); 

Resultado: 2009-12-31 19:01:01 GMT-06: 00

Eu estou no fuso horário do CDT. Certifique-se de que o DateTime seja inequivocamente DateTimeKind.Utc.

Algo como isso funciona. Você provavelmente poderia limpá-lo um pouco mais:

 string newDate = string.Format("{0:yyyy-MM-dd HH:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K")); 

Se como eu, você precisa de um formato como 2018-03-31T01:23:45.678-0300 (sem dois pontos na parte do fuso horário), você pode usar isto:

 datetime.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz").Remove(26,1) 

Eu acho que você está procurando a class TimeZoneInfo (consulte http://msdn.microsoft.com/en-us/library/system.timezoneinfo_members.aspx ). Tem muitos methods estáticos para converter datas entre fusos horários.

Esse método retornará o horário especificado no horário padrão do leste (conforme a pergunta solicitada), mesmo que o EST não seja o fuso horário local :

 public string GetTimeInEasternStandardTime(DateTime time) { TimeZoneInfo easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTimeOffset timeInEST = TimeZoneInfo.ConvertTime(time, easternStandardTime); return timeInEST.ToString("yyyy-MM-dd hh:mm:ss tt\" GMT\"zzz"); } 

Nota: Eu não testei isso em um sistema operacional diferente do inglês. Veja a documentação do MSDN em TimeZoneInfo.FindSystemTimeZoneById .