Perché non utilizzare semplicemente l'identificatore di formato Round-trip ("O", "o") ?
L'identificatore di formato standard "O" o "o" rappresenta una stringa di formato di data e ora personalizzata utilizzando un modello che conserva le informazioni sul fuso orario ed emette una stringa di risultato conforme a ISO 8601. Per i valori DateTime, questo identificatore di formato è progettato per preservare la data e valori di tempo insieme alla proprietà DateTime.Kind nel testo. La stringa formattata può essere analizzata utilizzando il metodo DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact se il parametro styles è impostato su DateTimeStyles.RoundtripKind.
L'identificatore di formato standard "O" o "o" corrisponde alla stringa di formato personalizzato "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" per i valori DateTime e al Stringa di formato personalizzato "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" per i valori DateTimeOffset. In questa stringa, le coppie di virgolette singole che delimitano i singoli caratteri, come i trattini, i due punti e la lettera "T", indicano che il singolo carattere è un letterale che non può essere modificato. Gli apostrofi non vengono visualizzati nella stringa di output.
L'identificatore di formato standard O "o" o "(e la stringa di formato personalizzato" yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK ") sfrutta i tre modi in cui che ISO 8601 rappresenta le informazioni sul fuso orario per preservare la proprietà Kind dei valori 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);
}
}