Чому б просто не використовувати специфікатор формату в обидва кінці ("O", "o") ?
Стандартний специфікатор формату "O" або "o" представляє власний рядок формату дати та часу із використанням шаблону, який зберігає інформацію про часовий пояс та випромінює рядок результатів, що відповідає ISO 8601. Для значень DateTime цей специфікатор формату призначений для збереження дати і значення часу разом із властивістю DateTime.Kind у тексті. Відформатований рядок можна проаналізувати назад за допомогою DateTime.Parse (String, IFormatProvider, DateTimeStyles) або DateTime.ParseExact, якщо для параметра стилів встановлено DateTimeStyles.RoundtripKind.
Специфікатор стандартного формату "O" або "o" відповідає рядку користувацького формату "Значення дати і часу" та "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK" "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" рядок користувацького формату для значень DateTimeOffset. У цьому рядку пари одинарних лапок, які розмежовують окремі символи, такі як дефіси, двокрапки та буква "Т", вказують на те, що окремий символ - це літерал, який не можна змінити. Апострофи не відображаються у вихідному рядку.
Специфікатор стандартного формату O "або" o "(і рядок користувацького формату" yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffffffK ") використовує три способи: що ISO 8601 представляє інформацію про часовий пояс для збереження властивості Kind значень 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);
}
}