Исходя из информации, предоставленной вами в комментариях к вопросу:
testtime
берется из ячейки таблицы данных следующим образом:
testtime = Convert.ToDateTime(dataGridViewTestList.Rows[e.RowIndex].Cells[6].Value);
Value
свойство DataGridViewCell
имеет тип object
, что означает, что оно может быть любым.В этом случае это, скорее всего, либо string
в определенном формате, либо это уже DateTime
.Во многом это зависит от того, как вы заполнили DataGridView
.
Если значение ячейки уже равно DateTime
, то Convert.ToDateTime
просто пропускает его через нетронутым.С тем же успехом вы можете просто разыграть его с (DateTime) theValue
вместо Convert.ToDateTime(theValue)
.Вы получите те же результаты.
- Свойство
.Kind
полученного значения будет идентично входному значению.Это может быть любой из DateTimeKind.Utc
, DateTimeKind.Local
или DateTimeKind.Unspecified
.
Если значение ячейки равно string
, то Convert.ToDateTime
равно разбор строки, используя текущую культуру.Это эквивалентно вызову DateTime.Parse(theValue)
, за исключением того, что вы не получите ни одного из дополнительных параметров для управления синтаксическим анализом.
- Свойство
.Kind
результирующего значения будет DateTimeKind.Local
, если есть какой-либо часовой поясинформация во входной строке или DateTimeKind.Unspecified
, если ее нет.Это не может быть DateTimeKind.Utc
, исходя из Convert.ToDateTime
.
Как вы можете видеть, в зависимости от того, как вы получаете значение DateTime
, его свойство .Kind
может изменяться.Это важно, потому что это управляет поведением TimeZoneInfo.ConvertTime
, как описано в документации (прокрутите до раздела «Замечания»).
Важно отметить, что если Kind
равно Unspecified
, то он обрабатывается так же, как если бы он был Local
.Поэтому в вашем случае, скорее всего, происходит то, что преобразование всегда идет от местного времени (каким бы оно ни было) к ирландскому времени.Таким образом, для ирландских пользователей, это, кажется, не изменяется вообще.
Если цель состоит в том, чтобы перейти от времени Аризоны к ирландскому времени всегда , то вам нужно указать оба часовых пояса,и вам нужно убедиться, что ввод Kind
всегда DateTimeKind.Unspecified
.
// This is needed if the Kind isn't already Unspecified
DateTime timeInArizona = DateTimeKind.SpecifyKind(testtime, DateTimeKind.Unspecified);
// Get the from and to time zone (yes, the IDs have weird naming conventions)
TimeZoneInfo arizonaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time");
TimeZoneInfo irelandTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
// Do the conversion, specifying both time zones
DateTime timeInIreland = TimeZoneInfo.ConvertTime(timeInArizona, arizonaTimeZone, irelandTimeZone);