C # TimeZone Расчет проблемы - PullRequest
2 голосов
/ 18 ноября 2010

У меня есть серверное приложение, которое обрабатывает кредиты в разных часовых поясах.Сервер работает с использованием UTC, запланированное задание запустит процесс на сервере @ 08:00 по местному времени и выберет ссуды в этом часовом поясе для обработки.Сервер должен проверять каждый заем, а затем для определенных займов установить тайм-аут, который будет срабатывать в определенное местное время (с учетом летнего времени), например, для аргумента 17:30 следующего дня, ему нужно будет рассчитать UTC-эквивалентное время, а затемколичество часов, минут и секунд, которые должны пройти до истечения времени ожидания.

Я думаю, что проблема заключается в переводе бизнес-требований на время ожидания в настраиваемую настройку.Это требование может измениться до 17:30 в тот же день или до 17:30 на следующей неделе.Мне нужно решение (если оно есть), которое бы справлялось с изменениями перехода на летнее время, происходящими в период достижения тайм-аута.

Ответы [ 4 ]

1 голос
/ 18 ноября 2010

Так что вам просто нужно преобразовать местное время в определенном часовом поясе в время UTC (которое подходит для тайм-аутов и т. Д.)?

Используйте TimeZoneInfo.ConvertTimeToUtc, передавая местную дату / время как DateTime и соответствующие TimeZoneInfo.

Стоит знать, что некоторые локальные времена могут не существовать или могут происходить дважды вокруг изменений летнего времени. В большинстве часовых поясов это происходит рано утром по местному времени, поэтому это может не повлиять на ваши бизнес-правила, но об этом стоит знать. Вы можете обнаружить это с помощью TimeZoneInfo.IsAmbiguousTime и TimeZoneInfo.IsInvalidTime, если вам нужно - хотя вам, конечно, нужно будет решить, что делать после того, как вы его обнаружили.

1 голос
/ 18 ноября 2010

Если вы знаете местное время, его часовой пояс и требуемую дату, вы всегда можете получить его как универсальное время, используя TimeZoneInfo.ConvertTimeToUtc .

TimeZoneInfo осведомлен о DST, поэтому вы должны иметь возможность различать два универсальных (UTC) времени, которые вы получаете таким образом (от локального времени текущего сервера и от цели истечения таймера в интересующей временной зоне ссуды)определить необходимый интервал таймера.

0 голосов
/ 19 ноября 2010

Рекомендую против преобразования в UTC. Когда DST начинается / заканчивается, он постоянно меняется, а иногда и с небольшим уведомлением (однажды Агентина изменила статусный день на 12 дней спустя). И похоже, что вы хотите, чтобы процесс запускался в 17:30 по местному времени.

Единственный способ сделать это - сохранить местное время и часовой пояс. И обратите внимание, «местное время» - это не время в этом часовом поясе, а просто установленное время дня. Затем, когда вам нужно рассчитать время следующего запуска, примените часовой пояс к тайме для текущей даты и получите время по Гринвичу для следующего события.

Так что конкретные события - хранить в UTC. Повторяющиеся события - магазин по местному времени и часовому поясу.

Больше на http://blogs.windwardreports.com/davidt/2009/11/what-every-developer-should-know-about-time.html

0 голосов
/ 18 ноября 2010

Звучит достаточно просто - используйте DateTimeOffset .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...