2014-10-20 2 views
0

Я нахожусь в Бразилии, и мы перешли на летнее время в эту субботу.PHP добавить один день в период летнего времени

У меня есть цикл, который генерирует временные метки для полночи за каждый день в выбранном таймере. Так я получаю timestam первого дня:

$start = 1413255600; // 2014-10-14 00:00:00 
$end is some date in the future 

А теперь я ahve петлю,

for ($i = $start; $i <= $end; $i = strtotime('+ 1 day', $i)) { 
    echo date('Y-m-d H:i:s', $i); 
    echo "<br>"; 
} 

Воспроизводит:

2014-10-14 00:00:00 
2014-10-15 00:00:00 
2014-10-16 00:00:00 
2014-10-17 00:00:00 
2014-10-18 00:00:00 
2014-10-19 01:00:00 
2014-10-20 01:00:00 

не должны PHP/сервер теперь, было ли изменение времени и добавить только 23 часа 19-го? Что я делаю неправильно?

Мой часовой пояс правильный, и сервер автоматически переходит в летнее время на летнее время.

ответ

3

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

Это ваша первая проблема - при условии, что полночь даже существует. Независимо от того, действительно ли это зависит от вашего определения полуночи.

В часовом поясе Бразилиа (и, возможно, других в регионе), 2014-10-19 00:00:00 не произошло. Местные времена пошли:

2014-10-18 23:59:58 
2014-10-18 23:59:59 
2014-10-19 01:00:00 
2014-10-19 01:00:01 

Так что ваш сценарий это делает правильную вещь - она ​​добавляется один день 2014-10-18 00:00:00 и придумать разумный ответ: 2014-10-19 01:00:00. Затем вы просите на следующий день после , что значение (1am), которое вполне разумно 1am на 20-м.

Если вы хотите «самое раннее время суток на каждую дату», то вы должны убедиться, что $start является датой, которая делает есть в полночь, а затем добавить 0 дней, 1 день, 2 дня, 3 дня и т.д., чтобы $start - вместо повторного добавления один день. Я не разработчик PHP, но мне кажется, что использование DateTime::Add было бы лучшим подходом к этому, чем использование strtotime.

2

В соответствии с ответом Джона Скита, вот как это сделать, используя классы DateTime() PHP.

$start = $start = (new DateTime('@1413255600'))->modify('midnight'); // Start date 
$end  = new DateTime('2014-10-22'); // End date 
$interval = new DateInterval('P1D'); // Interval of one day 
$period = new DatePeriod($start, $interval, $end); // Period object to iterate through 

foreach ($period as $date) { 
    echo $date->format('Y-m-d H:i:s'); 
    echo "\n"; 
} 

Справочник

Demo

Смежные вопросы