Почему бы просто не использовать описатель формата Round-trip ("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" для значений DateTime и Строка настраиваемого формата для значений DateTimeOffset "yyyy" - 'MM' - 'dd'T'HH': 'mm': 'ss'. 'fffffffzzz'. В этой строке пары одинарных кавычек, разделяющих отдельные символы, такие как дефисы, двоеточия и буква «T», указывают на то, что отдельный символ является литералом, который нельзя изменить. Апострофы не отображаются в выходной строке.
Описатель стандартного формата 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);
}
}