2013-05-31 2 views
1

Да, я знаю, есть DateTimeZone::getTransitions(). Но я немного смущен его выходом. То, что я бы ожидать, что список, как это:Список всех временнных переходов для указанного времени

2013-03-31 03:00:00 -> 2013-03-31 04:00:00 
2013-10-27 03:00:00 -> 2013-10-27 02:00:00 

Более того, я задаюсь вопросом, почему она возвращает информацию о $timestamp_begin. Как правило, пользователь не будет передавать временную метку перехода для этого параметра.

+0

Какой аспект вывода вы запутались? –

+0

В результирующем массиве есть «время». Вероятно, это время, когда происходит переход. И, вероятно, 'ts' напечатано в' UTC'. 'offset', вероятно, является результатом смещения. Но какова была стоимость предыдущего смещения? –

+0

Думаю, вам придется посмотреть на предыдущий элемент массива? –

ответ

2

Благодаря помощи Пекка 웃, я придумал следующий сценарий:

date_default_timezone_set('America/Havana'); 
$transitions = (new DateTime)->getTimeZone()->getTransitions(
    strtotime('2013-01-01'), 
    strtotime('2013-12-31')); 
date_default_timezone_set('UTC'); 
for ($i = 1; $i < count($transitions); $i++) 
     printf("%s -> %s\n", 
      strftime("%F %T", 
       $transitions[$i]['ts'] + $transitions[$i - 1]['offset']), 
      strftime("%F %T", 
       $transitions[$i]['ts'] + $transitions[$i]['offset'])); 
Смежные вопросы