Все уже прокомментировали проблемы с постоянно меняющимися ТЛЧ. Но я могу принять предпосылку, что мы просто притворяемся, что известные в настоящее время правила будут действовать вечно.
Чтобы получить информацию о летнем времени, первым делом нужно рассчитать год / месяц / день для вашей будущей даты (если она еще не указана в этой форме). Затем вы ищите свой часовой пояс и вытаскиваете вариацию против UTC, правило включения / выключения летнего времени и смещение. Может быть несколько разных правил, в зависимости от того, в каком году вы хотите выбрать правильное для своего «целевого» года. По причинам, изложенным ниже, может быть полезно знать правила предыдущего года.
Правила включения / выключения будут иметь забавную спецификацию, например «Oct lastSun»: это означает, что переключение происходит ночью последнего воскресенья октября.
То, что вам нужно сделать, это собрать все эти кратко отформатированные «правила» и разработать для каждого кусочек кода, чтобы определить последнюю дату, указанную этим правилом . Сейчас декабрь, поэтому, учитывая несколько правил, таких как «Mar lastSun» и «Oct lastSun» для моего часового пояса, эти даты будут 29 марта 2009 г. и 25 октября 2009 г. Какие из этих дат более поздние? Октябрь. Октябрь связан с отключением, поэтому в настоящее время у нас НЕТ летнего времени.
Вы можете рассчитать даты включения / выключения летнего времени для текущего (т.е. целевого) года независимо от того, является ли целевая дата до или после этих дат; если дата включения / выключения наступает в будущем вашей целевой даты, просто повторите расчет правила для предыдущего года. Обратите внимание, что правила могли измениться в течение интервала, поэтому обязательно применяйте правильное правило для года, который вы просматриваете.
Наихудший случай для этого расчета, вы должны повторить два вычисления вашего правила за предыдущий год. Но в противном случае поиск не ведется, так что это строго O (1).
Я нашел калькулятор Local / DST / Tz здесь: http://home -4.tiscali.nl / ~ t876506 / WhatDay.html и, поскольку это апплет JavaScript, вы должны иметь возможность просто зашифровать код. Однако он не обрабатывает все правила, поэтому вам нужно будет добавить код для оставшихся правил.
Обновление: Я только что заметил, что у вас есть час и минута. Это немного усложняет ситуацию. Если ваша дата не соответствует дате «переключения», то приведенные выше инструкции помогут вам. В противном случае вам нужно учитывать время. Я думаю, что самое чистое, что нужно сделать, - это включить время в ваше определение «самых последних». То есть если ваше целевое время - 00:30 UTC, а время переключения для данной зоны - 01:00, тогда время переключения целевого года все еще в будущем, и вместо этого вам придется использовать время переключения предыдущего года. В практических целях это будет означать, что «другое» время переключения было самым последним, и применяется его состояние включения / выключения.