¿Por qué no utilizar el Especificador de formato de ida y vuelta ("O", "o") ?
El especificador de formato estándar "O" u "o" representa una cadena de formato de fecha y hora personalizada que utiliza un patrón que conserva la información de la zona horaria y emite una cadena de resultado que cumple con ISO 8601. Para los valores de fecha y hora, este especificador de formato está diseñado para conservar la fecha y valores de hora junto con la propiedad DateTime.Kind en el texto. La cadena formateada se puede volver a analizar mediante el método DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact si el parámetro de estilos se establece en DateTimeStyles.RoundtripKind.
El especificador de formato estándar "O" u "o" corresponde a la cadena de formato personalizado "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" para los valores de fecha y hora y al "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" Cadena de formato personalizado para valores DateTimeOffset. En esta cadena, los pares de comillas simples que delimitan caracteres individuales, como los guiones, los dos puntos y la letra "T", indican que el carácter individual es un literal que no se puede cambiar. Los apóstrofos no aparecen en la cadena de salida.
El especificador de formato estándar O "u" o "(y la cadena de formato personalizado" aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK ") aprovecha las tres formas que ISO 8601 representa la información de la zona horaria para preservar la propiedad Kind de los 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);
}
}