Warum nicht einfach den Formatspezifizierer " Round-Trip" ("O", "o") verwenden ?
Der Standardformatbezeichner "O" oder "o" stellt eine benutzerdefinierte Datums- und Zeitformatzeichenfolge dar, die ein Muster verwendet, das Zeitzoneninformationen beibehält und eine Ergebniszeichenfolge ausgibt, die ISO 8601 entspricht. Bei DateTime-Werten dient dieser Formatbezeichner zum Beibehalten des Datums und Zeitwerte zusammen mit der DateTime.Kind-Eigenschaft im Text. Die formatierte Zeichenfolge kann mithilfe der Methoden DateTime.Parse (String, IFormatProvider, DateTimeStyles) oder DateTime.ParseExact zurückgemeldet werden, wenn der Parameter styles auf DateTimeStyles.RoundtripKind festgelegt ist.
Der Standardformatbezeichner "O" oder "o" entspricht dem benutzerdefinierten Format "yyyy" - "MM" - "dd'T'HH": "mm": "ss". "FffffffK" für DateTime-Werte und dem "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" benutzerdefinierte Formatzeichenfolge für DateTimeOffset-Werte. In dieser Zeichenfolge geben die Paare von einfachen Anführungszeichen, die einzelne Zeichen begrenzen, wie z. B. die Bindestriche, die Doppelpunkte und der Buchstabe "T", an, dass das einzelne Zeichen ein Literal ist, das nicht geändert werden kann. Die Apostrophe erscheinen nicht in der Ausgabezeichenfolge.
Der Standardformatbezeichner O "oder" o "(und der benutzerdefinierte Formatstring" yyyy "-" MM "-" dd'T'HH ":" mm ":" ss "." FffffffK ") nutzen die drei Möglichkeiten dass ISO 8601 Zeitzoneninformationen darstellt, um die Kind-Eigenschaft von DateTime-Werten beizubehalten:
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);
}
}
// The example displays the following output:
// 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000
// 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z
// 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00
//
// 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00