Я думаю, что PHP DateTimeZone::getTransitions
метод может привести вас туда.Он имеет процедурный псевдоним timezone_transitions_get()
.
public array DateTimeZone::getTransitions (
[ int $timestamp_begin [, int $timestamp_end ]] )
. Этот метод возвращает все «переходы» от значения смещения одного часового пояса к другому для этого часового пояса в заданном временном диапазоне.
Для ваших целей вам нужно будет создать DateTimeZone
объектов для каждого из ваших часовых поясов, позвонить DateTimeZone::getTransitions
для вашего диапазона дат, чтобы получить массив переходов для этого часового пояса, а затем объединить и отсортировать два массива переходов.Это даст вам эквивалент массива timezoneoffset[]
, который вы ищете.
Что-то вроде:
getTimezoneOffset(startDate,endDate,timezone1,timezone2){
DT1 = DateTimeZone( timezone1 );
transitions1 = DT1->getTransitions( startDate,endDate );
DT2 = DateTimeZone( timezone2 );
transitions1 = DT2->getTransitions( startDate,endDate );
timezoneoffset[] = // merge and sort (transitions1, transitions2)
}
Формат массива переходов недостаточно хорошо документирован.В документации метода приведены некоторые примеры записей:
Array
(
...
[1] => Array
(
[ts] => -1691964000
[time] => 1916-05-21T02:00:00+0000
[offset] => 3600
[isdst] => 1
[abbr] => BST
)
[2] => Array
(
[ts] => -1680472800
[time] => 1916-10-01T02:00:00+0000
[offset] => 0
[isdst] =>
[abbr] => GMT
)
...
)
Я предполагаю, что: ts
ссылается на временную метку PHP в секундах эпохи, возвращаемую time()
, давая момент времени, в который изменяется смещениек значению в этой записи.time
относится к тому же моменту времени, что и форматированная строка даты-времени.offset
- это смещение часового пояса в секундах от UTC, начиная с момента time
/ ts
, до следующего перехода.isdst
равно 1, если смещение относится к смещению перехода на летнее время, 0 в противном случае.abbr
- строковое сокращение для часового пояса.Если у кого-либо есть надежная информация об этой структуре данных, было бы полезно добавить ее в документацию .