Usando UTC
ISO 8601 ( formatos de fecha y hora de MSDN )
Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");
2009-11-13T10: 39: 35Z
La Z está ahí porque
Si la hora está en UTC, agregue una 'Z' directamente después de la hora sin espacios. 'Z' es el designador de zona para el desplazamiento UTC cero. Por lo tanto, "09:30 UTC" se representa como "09: 30Z" o "0930Z". "14:45:15 UTC" sería "14: 45: 15Z" o "144515Z".
Si desea incluir una compensación
int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);
Dos cosas a tener en cuenta: + o - es necesario después del tiempo, pero obviamente + no se muestra en números positivos. Según wikipedia, el desplazamiento puede estar en formato + hh o + hh: mm. Me he limitado a solo unas horas.
Hasta donde yo sé, RFC1123 (fecha HTTP, el formateador "u") no está destinado a dar compensaciones de zona horaria. Todas las horas deben ser GMT / UTC.
UtcNow.ToString(s)+Zes incorrecta. ISO8601 es compatible con la opción RoundTripToString("O"). También para señalar que la respuesta aceptada usa el valor UTC de la fecha y hora, que siempre daría la zona horaria Z, en lugar de solo usar el valor de fecha y hora real, que (si Kind = Local) puede contener una zona horaria de verano. ¿Considera cambiar la respuesta aceptada?