Почему бы просто не использовать Спецификатор формата туда и обратно ("O", "o") ?
Спецификатор стандартного формата «O» или «o» представляет пользовательскую строку формата даты и времени с использованием шаблона, который сохраняет информацию о часовом поясе и выдает строку результата, соответствующую стандарту ISO 8601. Для значений DateTime этот спецификатор формата предназначен сохранить значения даты и времени вместе со свойством DateTime.Kind в тексте. Отформатированную строку можно проанализировать с помощью метода DateTime.Parse (String, IFormatProvider, DateTimeStyles) или DateTime.ParseExact, если для параметра styles установлено значение DateTimeStyles.RoundtripKind.
Спецификатор стандартного формата «O» или «o» соответствует строке пользовательского формата «yyyy» - «MM» - «dd'T'HH»: 'mm': 'ss'. 'FffffffK "для значений DateTime и в строку пользовательского формата «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);
}
}
// 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