Cómo analizar y generar objetos DateTime en formato ISO 8601

Existe este servicio web SOAP que me envía objetos de fecha y hora en el siguiente formato

2016-03-29T12:20:35.093-05:00

Ese es el día 29 de marzo del año 2016. Hora: 12: 20: 35.093 (GMT-5).

Quiero poder crear unDateTime objeto, así:

DateTime.Now

y obtenga la representación de cadena en el formato descrito anteriormente y también la operación inversa, cree un DateTime a partir de una cadena como la dada anteriormente.

He intentado lo siguiente para crear la fecha:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)

Sin embargo, no puedo ver cómo especificar GMT-5 allí ...

Tampoco sé cómo convertir un DateTime al formato de cadena especificado.

Usando el código de Nate estoy haciendo lo siguiente:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)

Sin embargo, esta llamada regresa: "2016-03-29T15: 20: 35Z" en lugar de:

"2016-03-29T12:20:35.093-03:00"

que es lo que realmente necesito

Creo que esto funciona:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")

Respuestas a la pregunta(3)

Su respuesta a la pregunta