У Microsoft есть объяснение о том, как "обходить" даты и время при преобразовании их в и из строк; и ваша проблема (о которой я расскажу ниже) состоит в том, что вы потеряли Kind
.
Метод DateTime
ToString
"o" стандартный формат даст вам вид "туда-обратно", который вы ищете.
Используйте DateTime
Parse () с DateTimeStyles из RoundTripKind
, чтобы прочитать значение обратно.
Тот факт, что в вашем DateTime
отсутствует индикатор 'Z', означает (как указано на странице стандартного формата для "o"), что DateTime
'* Kind
равно Unspecified
. Если вы прочитали эти DateTime
s из своей базы данных, Kind
будет Unspecified
(вы можете использовать отладчик для проверки свойства Kind
после его прочтения, чтобы подтвердить это).
Способ заключается в том, что вы должны знать, какие типы DateTime
вы храните, чтобы вы могли установить Вид, когда читаете его (потому что, если вы этого не сделаете, Вид будет Неуказанным) , Например, если вы храните только UTC
Kind
DateTime
с, то когда вы читаете их из своей базы данных, вы можете установить Kind
в DateTime соответствующим образом. Вы можете сделать это так:
var myUtcDateTime = DateTime.SpecifyKind(myUnspecifiedDateTime, DateTimeKind.Utc);
У меня есть метод расширения для инкапсуляции этого от меня, поэтому я могу просто позвонить:
var myDateTime = dataReader.GetUtcDateTime(ordinal);
, который реализован так:
public static class DataReaderExtensions
{
public static DateTime GetUtcDateTime(this IDataReader reader, int ordinal)
{
var readDateTime = reader.GetDateTime(ordinal);
return DateTime.SpecifyKind(readDateTime, DateTimeKind.Utc);
}
}
Или вы можете посмотреть этот ответ , чтобы узнать, как это сделать с помощью Entity Framework.
(Обратите внимание, что этот подход работает для UTC; но вы не можете решить сделать то же самое с типом Local
, так как нет гарантии, что локальный код, в котором вы читаете значение, тот же самый в котором это было написано. Например, переход на летнее время, возможно, только начался или закончился.)
Но я должен сказать, что если вы действительно интересуетесь фактическим временем, лучшее решение этой разновидности проблемы (если вы простите за каламбур!) это используйте DateTimeOffset
с. Они хранят DateTime и Offset и гарантируют, что вы вернете то, что положили, без необходимости возиться с вещами.