TimeZoneInfo.ConvertTime работает для пользователей из США, но не для пользователей в Ирландии - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть приложение, в котором пользователь может запросить базу данных, чтобы найти результаты теста.Когда они дважды щелкают по одному из результатов, он открывает другую форму, чтобы показать данные.Я разработал это в Аризоне, и время тестирования базы данных показывает время Аризоны для пользователей в Аризоне и Ирландии.Часть открывающейся второй формы требует доступа к файлу журнала, и проблема с файлами журнала в Ирландии заключается в том, что время, указанное в имени файла, указано в GMT, а не в AZ.

Например, база данных показывает тествремя 05/12/2018 08:31 AM, но имя файла журнала для ирландского теста - 12/05/2018 15:31.Чтобы справиться с этим при разработке, я добавил исправление от времени теста ко времени файла журнала следующим образом:

 var IRTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
 var IRMetroDateCor = TimeZoneInfo.ConvertTime(testtime, IRTimeZone)

Это успешно работает, когда я запускаю приложение - он находит файл журнала без проблем.Я только что развернул его в Ирландии, чтобы они могли его протестировать, и, обнаружив некоторые неисправности, мы обнаружили, что линия ConvertTime ничего не делает.Время остается 05.12.2008 8:31.

Любые идеи о том, почему это будет работать здесь, но не там?Другие способы справиться с этим, чтобы он работал на обоих сайтах?

1 Ответ

0 голосов
/ 06 декабря 2018

Исходя из информации, предоставленной вами в комментариях к вопросу:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...