Dlaczego nie wystarczy użyć The Round-trip ("O", "o") Format Specifier?
„O” lub „o” standardowym formacie specifier reprezentuje ciąg formatu daty i czasu zwyczaj stosując wzór, który zachowuje informacje o strefie czasowej i emituje ciąg wynik, który jest zgodny z normą ISO 8601. Dla wartości DateTime, ten format Specifier ma na celu zachowanie wartości daty i godziny wraz z właściwością DateTime.Kind w tekście. Sformatowany ciąg może zostać ponownie przeanalizowany za pomocą metody DateTime.Parse (String, IFormatProvider, DateTimeStyles) lub DateTime.ParseExact, jeśli parametr style jest ustawiony na DateTimeStyles.RoundtripKind.
Specyfikator standardowego formatu "O" lub "o" odpowiada "yyyy" - "MM" - "dd'T'HH": "mm": "ss". "FffffffK" niestandardowy ciąg znaków dla DateTime wartości i do "yyyy" - "MM" - "dd'T'HH": "mm": "ss". "fffffffzzz" ciąg w formacie niestandardowym dla wartości DateTimeOffset. W tym ciągu pary pojedynczych cudzysłowów, które ograniczają poszczególne znaki, takie jak łączniki, dwukropki i litera "T", wskazują, że indywidualny znak jest literałem, którego nie można zmienić. Apostrofy nie pojawiają się w łańcuchu wyjściowym.
Specyfikator standardowego formatu O "lub" o "(i" yyyy "-" MM "-" dd'T'HH ":" mm ":" ss "." FffffffK "niestandardowy format) z trzech sposobów, że ISO 8601 reprezentuje informacje strefy czasowej do zachowania własności rodzaju 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);
}
}
// 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
@Dvvoter: Czy chciałbyś nam powiedzieć, co uważasz za błędne w tej odpowiedzi? – LukeH
To zadziałało, ale funkcja .ToUniversalTime() zepsułaby twoją istniejącą datę, jeśli jest już w UTC, ale zmienna yourDateTime jej nie określa. Skończyło się na usunięciu .ToUniversalTime(), a daty były zestawione z oczekiwaniami na obu końcach (baza danych i klient sieciowy). –