Это зависит от того, как был создан myRecord.StartTime
.
- Если вы получили его от
DateTime.Now
, то он будет иметь вид Local
.
- Если вы получили его от
DateTime.UtcNow
, то он будет иметь тип Utc
.
- Если вы получили его от
new DateTime(2013,5,1)
, то он будет иметь тип Unspecified
.
Это также зависит от того, откуда вы взяли myTimeZone
. Например:
TimeZoneInfo.Local
TimeZoneInfo.Utc
TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")
Функция TimeZoneInfo.ConvertTimeToUtc
будет работать только в том случае, если она может сопоставить зону с тем типом, который вы ей задаете. Если оба являются локальными или оба UTC, то это сработает. Если вы даете ему определенную зону, то тип не должен быть указан. Это поведение задокументировано в MSDN.
Вы можете легко воспроизвести исключение последовательно:
var tz = TimeZoneInfo.FindSystemTimeZoneById("Fiji Standard Time");
var utc = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, tz);
Предполагая, что вы не живете на Фиджи, это будет каждый раз ошибаться. Вы в основном сказали: «преобразовать мое местное время в какой-то другой зоне в utc», что не имеет смысла.
Это, вероятно, работает в вашей среде разработки, потому что значение, которое вы тестируете для myTimeZone
, оказывается локальной зоной для разработчика.
Что касается вашего изменения - конечно, вы можете заставить вид быть неопределенным, и это меняет смысл того, что вы делаете, так что это имеет смысл. Но вы уверены, что это то, что вы хотите? Что такое .Kind
даты перед рукой? Если это еще не Unspecified
, то у него есть какое-то намерение. Вероятно, вам следует вернуться к источнику этих данных и убедиться, что это именно то, что вы ожидаете.
Если все это звучит безумно, безумно, разочаровывающе и странно, то это потому, что объект DateTime
воняет. Вот дополнительное чтение:
Вместо этого вы можете использовать NodaTime. Его API убережет вас от таких распространенных ошибок.
01.05.2013
DateTime.SpecifyKind
. 07.08.2019