Dlaczego po prostu nie użyć specyfikatora formatu Round-trip („O”, „o”) ?
Specyfikator formatu standardowego „O” lub „o” reprezentuje niestandardowy ciąg formatu daty i godziny przy użyciu wzorca, który zachowuje informacje o strefie czasowej i emituje ciąg wynikowy zgodny z normą ISO 8601. W przypadku wartości DateTime ten specyfikator formatu jest przeznaczony do zachowania daty i wartości czasu wraz z właściwością DateTime.Kind w tekście. Sformatowany ciąg można przeanalizować z powrotem przy użyciu metody DateTime.Parse (String, IFormatProvider, DateTimeStyles) lub DateTime.ParseExact, jeśli parametr styles jest ustawiony na DateTimeStyles.RoundtripKind.
Specyfikator formatu standardowego „O” lub „o” odpowiada niestandardowemu ciągowi formatu „yyyy” - 'MM' - 'dd'T'HH': 'mm': 'ss'. „FffffffK” dla wartości DateTime i „rrrr '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" niestandardowy ciąg formatu dla wartości DateTimeOffset. W tym ciągu pary pojedynczych cudzysłowów oddzielające poszczególne znaki, takie jak łączniki, dwukropki i litera „T”, wskazują, że dany znak jest literałem, którego nie można zmienić. Apostrofy nie pojawiają się w ciągu wyjściowym.
Specyfikator formatu standardowego O ”lub„ o ”(i„ yyyy ”- 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK" niestandardowy ciąg formatu) wykorzystuje trzy sposoby że ISO 8601 reprezentuje informacje o strefie czasowej, aby zachować właściwość Kind wartości 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);
}
}