Como analisar e gerar objetos DateTime no formato ISO 8601

Existe esse serviço da web SOAP que me envia objetos de data e hora no seguinte formato

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

Este é o dia 29 de março do ano de 2016. Hora: 12: 20: 35.093 (GMT-5).

Eu quero ser capaz de criar umDateTime objeto, assim:

DateTime.Now

e obtenha a representação da string no formato descrito acima e também a operação inversa, crie um DateTime a partir de uma string como a fornecida acima.

Eu tentei o seguinte para criar a data:

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

No entanto, não consigo ver como especificar o GMT-5 lá ...

Também não sei como converter um DateTime para o formato de string especificado.

Usando o código de Nate, estou fazendo o seguinte:

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

FormatIso8601(d)

No entanto, esta chamada está retornando: "2016-03-29T15: 20: 35Z" em vez de:

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

que é o que eu realmente preciso.

Eu acho que isso funciona:

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