Por que não usar apenas o especificador de formato Round-trip ("O", "o") ?
O especificador de formato padrão "O" ou "o" representa uma string de formato de data e hora personalizada usando um padrão que preserva as informações de fuso horário e emite uma string de resultado que está em conformidade com ISO 8601. Para valores DateTime, este especificador de formato é projetado para preservar a data e valores de tempo junto com a propriedade DateTime.Kind no texto. A string formatada pode ser analisada de volta usando o método DateTime.Parse (String, IFormatProvider, DateTimeStyles) ou DateTime.ParseExact se o parâmetro styles estiver definido como DateTimeStyles.RoundtripKind.
O especificador de formato padrão "O" ou "o" corresponde à string de formato personalizado "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" para valores DateTime e "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" string de formato personalizado para valores DateTimeOffset. Nessa string, os pares de aspas simples que delimitam caracteres individuais, como os hifens, os dois pontos e a letra "T", indicam que o caractere individual é um literal que não pode ser alterado. Os apóstrofos não aparecem na string de saída.
O especificador de formato padrão O "ou" o "(e a string de formato personalizado" aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK ") tira proveito das três maneiras que ISO 8601 representa informações de fuso horário para preservar a propriedade Kind dos valores DateTime:
public class Example
{
public static void Main()
{
DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Unspecified);
Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind);
DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Utc);
Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind);
DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30,
DateTimeKind.Local);
Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind);
DateTimeOffset dto = new DateTimeOffset(lDat);
Console.WriteLine("{0} --> {0:O}", dto);
}
}